JVM总结:再谈G1


prtyaa
prtyaa 2023-12-28 15:34:22 62247 赞同 0 反对 0
分类: 资源
1、首先来回顾一下 G1,他是动态的把很多个region分给新生代(eden,survivor),老年代,大对象,但新生代Eden满了就要进行GC,新生代和老年代各自有一个占比。 G1只是垃圾回收器,新生代还是采用的复制算法,会考虑预设一个stw的时间,保证垃圾回收的时候不能超过这个预设的stw的时间,因此会选一些Region来回收。 然后跟之前说的一样,如果一些对象在新生代熬过了一定次数的GC,或者是触发了动态年龄判定规则,或者是存活对象在Survivor放 不下了,都会让对象进入老年代中。 而大对象则是进入单独的大对象Region,不再进入老年代。 所以实际上在G1中,还是会存在新生代的对象慢慢会因为各种情况进入老年代的。

2、什么时候触发新生代+老年代的混合垃圾回收?

G1有一个参数,是“-XX:InitiatingHeapOccupancyPercent”,他的默认值是45%,意思就是说,如果老年代占据了堆内存的45%的Region的时候此时就会尝试触发一个新生代+老年代一起回收的混合回收阶段。

比如按照我们之前说的,堆内存有2048个Region,如果老年代占据了其中45%的Region,也就是接近1000个Region的时候,就会开 始触发一个混合回收


3、G1垃圾回收的过程

初始标记:存在stw
首先会触发一个“初始标记”的操作,这个过程是需要进入“Stop the World”的,
仅仅只是标记一下GC Roots直接能引用的对象, 这个过程速度是很快的。
并发标记:不存在stw
这个阶段会允许系统程序的运行,同时进行GC Roots追踪,从GC Roots开始追踪所有的存活对象,
这个并发标记阶段还是很耗时的,因为要追踪全部的存活对象。
最终标记:存在stw
这个阶段会进入“Stop the World”,系统程序是禁止运行的,
但是会根据并发标记 阶段记录的 那些对象修改,最终标记一下有哪些存活对象,有哪些是垃圾对象,
混合回收:存在stw,老年代对堆内存占比达到45%的时候,触发的是“混合回收”,回收新生代,老年代,大对象

会计算老年代中每个Region中的存活对象数量,存活对象的占比,还有执行垃圾回 收的预期性能和效率。 接着会停止系统程序,然后全力以赴尽快进行垃圾回收,此时会选择部分Region进行回收,因为必须让垃圾回收的停顿时间控制在我 们指定的范围内。

比如说老年代此时有1000个Region都满了,但是因为根据预定目标,本次垃圾回收可能只能停顿200毫秒,那么通过之前的计算得 知,可能回收其中800个Region刚好需要200ms,那么就只会回收800个Region,把GC导致的停顿时间控制在我们指定的范围内。

而且大家需要在这里有一点认识,老年代对堆内存占比达到45%的时候,触发的是“混合回收” 。也就是说,此时垃圾回收不仅仅是回收老年代,还会回收新生代,还会回收大对象。


4、G1垃圾回收器的一些参数 ,整体基于复制算法

什么时候触发Mixed回收?

一般在老年代的Region占据了堆内存的Region的45%之后,会触发一个混合回收的过程,也就是Mixed GC, 

分为了好几个阶段。

在这里最后一个环节,其实就是执行混合回收,从新生代和老年代里都回收一些Region。

但是最后一个阶段混合回收的时候,其实会停止所有程序运行,所以说G1是允许执行多次混合回收。

比如先停止工作,执行一次混合回收回收掉 一些Region,接着恢复系统运行,然后再次停止系统运行,再执行一次混合回收回收掉一 些Region。

有一些参数可以控制这个,比如“-XX:G1MixedGCCountTarget”参数,就是在一次混合回收的过程中,最后一个阶段执行几次混合 回收,默认值是8次

意味着最后一个阶段,先停止系统运行,混合回收一些Region,再恢复系统运行,接着再次禁止系统运行,混合回收一些Region,反 复8次。

那么为什么要反复回收多次呢?

因为停止系统一会儿,回收掉一些Region,再让系统运行一会儿,然后再次停止系统一会儿,再次回收掉一些Region,这样可以尽 可能让系统不要停顿时间过长,可以在多次回收的间隙,也运行一下。

还有一个参数,就是“-XX:G1HeapWastePercent”,默认值是5%

他的意思就是说,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他 Region,然后这个Region中的垃圾对象全部清理掉。

这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会 立即停止混合回收,意 味着本次混合回收就结束了。

而且从这里也能看出来G1整体是基于复制算法进行Region垃圾回收的,不会出现内存碎片的问题,不需要像CMS那样标记-清理之 后,再进行内存碎片的整理。

 

存活对象低于85%的Region才可以进行回收

参数,“-XX:G1MixedGCLiveThresholdPercent”,他的默认值是85%,意思就是确定要回收的Region的时候,必须是存 活对象低于85%的Region才可以进行回收


5、回收失败时的Full GC

如果在进行Mixed回收的时候,无论是年轻代还是老年代都基于复制算法进行回收,都要把各个Region的存活对象拷贝到别的Region 里去

此时万一出现拷贝的过程中发现没有空闲Region可以承载自己的存活对象了,就会触发 一次失败。

一旦失败,立马就会切换为停止系统程序,然后采用单线程进行标记、清理和压缩整理,空闲出来一批Region,这个过程是极慢极慢 的。


6、本文总结

老年代占堆内存45%的时候触发Mixed垃圾回收

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL3
粉丝 1 资源 1949 + 关注 私信
最近热门资源
麒麟系统版本介绍白皮书  516
MiSans 阿拉伯语字体文件  458
解决新版本麒麟系统中微信打开白屏显示  400
麒麟系统进行系统监控,查看进程的运行时间来优化性能  332
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!)  224
统信桌面专业版添加字体  217
统信uos单一程序黑屏,任务栏正常显示解决办法  216
统信uos快捷键文档  187
统信系统双无线网卡设置关闭开启单一网卡  145
分享一个磁盘恢复工具,适用于多平台(包括统信)  122
最近下载排行榜
麒麟系统版本介绍白皮书 0
MiSans 阿拉伯语字体文件 0
解决新版本麒麟系统中微信打开白屏显示 0
麒麟系统进行系统监控,查看进程的运行时间来优化性能 0
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!) 0
统信桌面专业版添加字体 0
统信uos单一程序黑屏,任务栏正常显示解决办法 0
统信uos快捷键文档 0
统信系统双无线网卡设置关闭开启单一网卡 0
分享一个磁盘恢复工具,适用于多平台(包括统信) 0
作者收入月榜
1

prtyaa 收益399.62元

2

zlj141319 收益236.11元

3

IT-feng 收益219.61元

4

1843880570 收益214.2元

5

风晓 收益208.24元

6

哆啦漫漫喵 收益204.5元

7

777 收益173.07元

8

Fhawking 收益106.6元

9

信创来了 收益106.03元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

添加我为好友,拉您入交流群!

请使用微信扫一扫!