JVM_06G1垃圾收集器
2023-03-22 21:25:41 5 举报
AI智能生成
G1垃圾收集器
作者其他创作
大纲/内容
设计初衷
主要针对配备多颗处理器及大容量内存的机器
以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.
区域划分
Region
将Java堆划分为多个大小相等的独立区域(Region)
JVM目标是不超过2048个Region
TARGET_REGION_NUMBER 定义
实际可以超过该值,但是不推荐
大小划分
堆大小除以2048
例子:堆大小为4096M,则Region大小为2M
参数"-XX:G1HeapRegionSize"手动指定Region大小,但是推荐默认的计算方式
保留了年轻代和老年代的概念
不再是物理隔阂了,它们都是(可以不连续)Region的集合
年轻代
对堆内存的占比是5%
对应大概是100个Region
-XX:G1NewSizePercen设置新生代初始占比
在系统运行中,JVM会不停的给年轻代增加更多的Region,但是最多新生代的占比不会超过60%
-XX:G1MaxNewSizePercent调整
Eden和Survivor对应的region也跟之前一样,默认8:1:1
Region的区域功能可能会动态变化
一个Region可能之前是年轻代
Region进行了垃圾回收,之后可能又会变成老年代
Humongous区
对大对象的处理,不是让大对象直接进入老年代的Region中
专门存放短期巨型对象,不用直接进老年代,可以节约老年代的空间,避免因为老年代空间不够的GC开销
大对象
超过了一个Region大小的50%
放入Humongous中
如果太大,可能会横跨多个Region来存放。
Full GC的时候除了收集年轻代和老年代之外,也会将Humongous区一并回收
一次GC(主要值Mixed GC)的运作
初始标记
暂停所有的其他线程,并记录下gc roots直接能引用的对象,速度很快
并发标记
同CMS的并发标记
最终标记
同CMS的重新标记
筛选回收
首先对各个Region的回收价值和成本进行排序
根据用户所期望的GC停顿STW时间,定制计划
-XX:MaxGCPauseMillis指定
例如:老年代此时有1000个Region都满了,但是因为根据预期停顿时间,本次垃圾回收可能只能停顿200毫秒,
那么通过之前回收成本计算得知,可能回收其中800个Region刚好需要200ms,那么就只会回收800个Region(Collection Set,要回收的集合)
那么通过之前回收成本计算得知,可能回收其中800个Region刚好需要200ms,那么就只会回收800个Region(Collection Set,要回收的集合)
尽量把GC导致的停顿时间控制在我们指定的范围内
后台会维护一个优先列表
Garbage-First
根据允许的收集时间,优先选择回收价值最大的Region
例如:一个Region花200ms能回收10M垃圾,另外一个Region花50ms能回收20M垃圾,
在回收时间有限情况下,G1当然会优先选择后面这个Region回收
在回收时间有限情况下,G1当然会优先选择后面这个Region回收
回收阶段其实也可以做到与用户程序一起并发执行
回收算法
复制算法
将一个region中的存活对象复制到另一个region中
回收完几乎不会有太多内存碎片
与CMS的区别
CMS回收阶段是跟用户线程一起并发执行的
G1因为内部实现太复杂暂时没实现并发回收(回收一会,用户线程执行一会,某种意义是串行)
ZGC,Shenandoah就实现了并发收集,Shenandoah可以看成是G1的升级版本
特点
并行与并发
G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿时间
其他收集器原本需要停顿Java线程来执行GC动作,G1收集器仍然可以通过并发的方式让java程序继续执行
分代收集
G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念
空间整合
CMS
标记--清理
G1
整体基于“标记整理”算法
局部“复制”算法
可预测的停顿
追求低停顿外
建立可预测的停顿时间模型
让使用者明确指定在一个长度为M毫秒的时间片段内完成垃圾收集
垃圾收集分类
正常情况G1的垃圾收集是先做MixedGC
YoungGC
当edan区满了,G1会计算下现在Eden区回收大概要多久时间
如果回收时间远远小于参数 -XX:MaxGCPauseMills 设定的值,那么增加年轻代的region,继续给新对象存放,不会马上做Young GC
直到下一次Eden区放满,G1计算回收时间接近参数 -XX:MaxGCPauseMills 设定的值,那么就会触发Young GC
MixedGC
不是FullGC
老年代的堆占有率达到参数(-XX:InitiatingHeapOccupancyPercent)设定的值则触发
回收对象
所有young区
大对象区
部分old
根据期望的GC停顿时间确定old区垃圾收集的优先顺序
Full GC
MixedGC时,使用复制算法到别的region里时,如果发现没有足够的空region能够承载拷贝对象就会触发一次Full GC
停止系统程序,然后采用单线程进行标记、清理和压缩整理,好空闲出来一批Region来供下一次MixedGC使用
过程是非常耗时的
0 条评论
下一页