JVM那些事——垃圾回收和内存分配

news2024/9/27 9:24:09

内存分配

在这里插入图片描述
默认情况下新生代和老年区的内存比例是1:2,新生代中Eden区和Survivor区的比例是8:1。

  1. 对象优先分配在Eden区。
  2. 大对象直接进入老年区。通过-XX:PertenureizeThreshold参数设置临界值。
  3. 长期存活的对象进入老年区。对象每熬过一次Minor GC,年龄+1,当年龄增加到一定程度(默认15岁)就会进入老年区。-XX:MaxTenuringThreshold设置年龄临界值。
  4. 如果Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一办,年龄大于或等于该年龄的对象直接进入老年区。

何时发生GC及空间分配担保

Eden区没有足够空间分配内存时,发生Minor GC.

Minor GC:指发生在新生代的GC动作。一般速度迅速。
Major GC /Full GC:值发生在老年代的GC,一般速度比Minor GC慢上10倍。

在Minor GC之前,JVM会先检查老年代最大可用连续空间是否大于新生代所有对象总空间,如果成立,那么MinorGC可以确保是安全的。否则,查看HandlePromotionFailure设置值是否允许担保失败,如果允许会尝试进行MinorGC,否则会进行一次FullGC。

对象是否死去?

引用计数法

给对象中添加一个引用计数器,每当一个地方引用时计数器就加1,当引用失效时,计数器减1。当计数器值为0的时候,这个对象将不可能被引用,则判断该对象死亡。

  • 弊端:会出现循环引用而导致无法GC的情况。

可达性分析算法

通过一个根节点GC Roots向下搜索,当一个对象无法从GC Roots搜索到时,则证明此对象是可不用的。

引用

  • 强引用:有引用,绝不回收。
  • 软引用:在系统将要发生OOM之前,将对象纳入回收范围,如果这次回收有足够内存,则在下一次GC时进行回收。
  • 弱引用:GC时,无论当前内存是否足够,都会被回收掉。
  • 虚引用:和没有引用没有用多大区别,只是能在对象被GC时收到一个系统通知。

finalize

一个对象的死亡需要经历至少两次标记过程,在可达性分析时不可达则会进行第一次标记,并且进行一次筛选,筛选条件就是该对象是否有必要执行finalize()方法,当对象没有覆盖finalize方法,或finalize方法已经被JVM调用过了,JVM则任务该对象没有执行finalize的必要了。如果该对象有必要执行finalize方法,则该对象会被放到一个F-Queue队列中,稍后交由一个JVM自动建立的低优先级的Finalizer线程执行注意:这里智慧触发这个方法,并不保证会等待它运行结束。如果该对象在finalize执行中成功将自己关联到GC Root链上,JVM则会在第二次标记过程中将该对象从即将回收的集合中移除。

垃圾回收算法

标记 - 清除算法

算法分两个节点,标记阶段将要回收的对象进行标记,回收阶段直接将标记的内存进行回收。

  • 缺点:1. 标记和清除阶段的效率都不高。2.标记清除后会产生大量不连续内存碎片。

复制算法

将内存分成大小相等的两块,每次使用其中一块,当这块内存快使用完时,将还存活的对象复制到另一块上。

  • 缺点:内存缩小了一半。
    实际中发现不需要按1:1划分,默认情况下,JVM将年轻代按8:1:1分成eden、survivor1和survivor2三块。每次GC时,将Eden和其中一块Survivor中还活着的对象一次性复制到另一块Survivor上,最后清理掉Eden和刚才用过的Survivor的空间。当survivor空间不够时,由老年代内存进行分配担保,也就是将对象放到老年代中。

标记-整理算法

标记死去的对象,清除后将活着的对象整理在一起。

分代收集算法

新生代和老年代,不同的内存区域采用不同的收集算法。

GC日志

配置-XX:+PrintGCDetails参数,JVM会在发生GC时打印GC日志。
33.125: 1 [GC2 (Allocation Failure)[PSYoungGen3: 21096K->32K(22528K)4] 22608K->1543K(91136K)5,0.0008844 secs]6[Times: user=0.00 sys=0.00, real=0.00 secs]

在这里插入图片描述


  1. GC发生的时间。距离JVM启动的秒数。 ↩︎

  2. 说明这次GC的停顿类型。[Full GC 一般是因为出现了分配担保失败之类的问题导致STW。 ↩︎

  3. 表明GC发生的区域。 ↩︎

  4. GC前该内存区域已使用容量->GC后该内存区域已使用容量(该区域总容量) ↩︎

  5. GC前JAVA堆已使用容量->GC后JAVA堆已使用容量(Java堆总容量) ↩︎

  6. GC所占用时间。单位秒 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/354414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【面试题】Map和Set

1. Map和Object的区别 形式不同 // Object var obj {key1: hello,key2: 100,key3: {x: 100} } // Map var m new Map([[key1, hello],[key2, 100],[key3, {x: 100}] ])API不同 // Map的API m.set(name, 小明) // 新增 m.delete(key2) // 删除 m.has(key3) // …

操作系统闲谈06——进程管理

操作系统闲谈06——进程管理 一、进程调度 01 时间片轮转 给每一个进程分配一个时间片,然后时间片用完了,把cpu分配给另一个进程 时间片通常设置为 20ms ~ 50ms 02 先来先服务 就是维护了一个就绪队列,每次选择最先进入队列的进程&#…

Prometheus PromQL入门

一、Prometheus简介和架构 Prometheus 是由 SoundCloud 开源监控告警解决方案。架构图如下: 如上图,Prometheus主要由以下部分组成: Prometheus Server:用于抓取和存储时间序列化数据Exporters:主动拉取数据的插件P…

Chrome开发者工具:利用网络面板做性能分析

Chrome 开发者工具(简称 DevTools)是一组网页制作和调试的工具,内嵌于 Google Chrome 浏览器中。 Chrome 开发者工具有很多重要的面板,比如与性能相关的有网络面板、Performance 面板、内存面板等,与调试页面相关的有…

字符串匹配 - 模式预处理:BM 算法 (Boyer-Moore)

各种文本编辑器的"查找"功能(CtrlF),大多采用Boyer-Moore算法,效率非常高。算法简介在 1977 年,Robert S. Boyer (Stanford Research Institute) 和 J Strother Moore (Xerox Palo Alto Research Center) 共…

SpringCloud(二)负载均衡服务调用Ribbon、服务接口调用OpenFeign案例详解

五、负载均衡服务调用Ribbon 技术版本Spring Cloud版本Hoxton.SR1Spring Boot版本2.2.2RELEASECloud Alibaba版本2.1.0.RELEASE Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。 简单的说,Ribbon是Netflix发布的开源项目,主…

DOS经典软件,落下帷幕,新型国产平台,蓬勃发展

提起DOS时代,总让人难以忘怀,陷入深深回忆中,风靡一时的许多软件,如今早已不在,这几款被称为DOS必装的软件,更是让人惋惜。 你还记得这图吗?堪称DOS系统最经典的软盘复制与映像生成软件&#xf…

八十九——一三三

八十九、JavaScript——数组的简介 一、数组 数组(Array) - 数组也是一中复合数据类型,在数组可以存储多个不同类型的数据 - 数组中存储的是有序的数据,数组中的每个数据有一个唯一的索引 可以通过索引来操作获取数据 - 数据中存储的数据叫元素 - 索引&…

从 MVC 架构到三层(3-Tier)架构

一、MVC 存在的痛点问题 对于业务逻辑不甚复杂的场景,MVC 尚能胜任。但随着前端 MVVM(Model-View-View-Model)开发模式的兴起,尤其是前端框架如 Vue、React 的普及,服务端的 MVC 设计模式使用场景变得越来越少&#x…

NetSuite Intercompany Framework 101

今朝,谈一谈Intercompany Framework,这是一个彰显NetSuite市场野心的基础功能框架。从20.2开始逐渐浮出水面,虽然经过过往的几个版本,不断推出组成功能,但目前仍然未见其全貌。 作为顾问,你必须关注它&…

详解JavaScript的形参,实参以及传参

文章目录 前言一、参数是什么?二、形参和实参 1.形参 2.实参三、传参 1.参数传递的对应关系2.两个传参的例子 总结前言 编程初学者在接触JavaScript这门语言时,很难搞懂里面的逻辑,这就会导致入门慢,入门难。这种难度一般…

Banana Pi BPI-R3 评测:详细信息、功能

Banana Pi BPI-R3 路由板著名的 Banana Pi 品牌背后的公司 Sinovoip Co., Ltd 刚刚宣布了一款名为 Banana Pi BPI-R3 的带有两个 SFP 端口的新型开源路由器。它可能是市场上首批具有内置光接口的单板路由器之一。这种出色的产品对于连接到快速光纤互联网的用户特别有益&#xf…

【PyTorch学习4】《PyTorch深度学习实践》——线性回归(Linear Regression)

目录一、实现框架二、程序实现三、代码讲解1.self.linear torch.nn.Linear(1, 1)2.model(x_data)3.criterion torch.nn.MSELoss(reductionsum),loss criterion(y_pred, y_data)一、实现框架 1、Prepare dataset 2、Design model using Class (inherit from nn.M…

【Leedcode】顺序表必备的三道面试题(附图解)

顺序表必备的三道面试题(附图解) 文章目录顺序表必备的三道面试题(附图解)前言一、第一题1.题目2.思路图解3.源码二、第二题1.题目2.思路图解3.源码三、第三题1.题目2.思路图解3.源码总结前言 本文给大家介绍三道顺序表学习过程中…

【项目精选】javaEE土地档案管理系统(源码+论文+视频)

技术:java、jsp、struts、spring、hibernate 数据库:oracle 集成开发工具:eclipse 点击下载源码 本土地项目管理系统在可行性研究的基础上,是为了进一步明确土地项目管理系统的软件需求,以便安排项目规划和进度&#x…

ARM+LINUX嵌入式学习路线

嵌入式学习是一个循序渐进的过程,如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式Linux方向,关注这个方向,大概分3个阶段: 1、嵌入式linux上层应用,包括QT的GUI开发 2、嵌入式linux系统开发 3、…

Python|每日一练|字符串|递归|链表|单选记录:字符串转换整数 (atoi)|阶乘后的零| K 个一组翻转链表

1、字符串转换整数 (atoi)(字符串) 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃…

Golang 方法笔记

Golang中的方法是作用在指定的数据类型上的,因此自定义类型都可以有方法。方法定义func (recevier type) methodName (参数列表) (返回值列表) {方法体return 返回值}基本申明和调用type A struct {Num int}func (a A) test() {fmt.Println(a.Num)}说明:…

Python快速上手系列--邮件发送--详解篇

本章就来一起学习一下跑完自动化脚本后如何自动的发送邮件到指定的邮箱。zmail操作:1. 导包 import zmail2. 邮件内容,包含:主题(subject)、正文(content_text)、附件(attachments)3. 发件人信息,包含:发件人账号&…

什么牌的运动耳机比较好、运动耳机排行榜10强

现在运动健身的潮流持续不下,而且人们长期坐于办公室办公,严重影响身体的健康,这时不论是去健身房锻炼,还是户外跑步都是非常必要的了,而蓝牙耳机作为运动必备的一款数码产品,更是受到了大家的青睐&#xf…