JVM_06ZGC收集器
2023-03-22 21:26:08 0 举报
AI智能生成
JVM_06ZGC收集器
作者其他创作
大纲/内容
定义
具有实验性质的低延迟垃圾收集器
基于Region内存布局的, 暂时不设分代的, 使用了读屏障、 颜色指针等技术来实现可并发的标记-整理算法的, 以低延迟为首要目标的一款垃圾收集器
目标
支持TB量级的堆
最大GC停顿时间不超10ms
奠定未来GC特性的基础
最糟糕的情况下吞吐量会降低15%
它的停顿时间不会随着堆的增大而增长!也就是说,几十G堆的停顿时间是10ms以下,几百G甚至上T堆的停顿时间也是10ms以下
不分代(暂时)
单代,即ZGC「没有分代」
分代实现起来麻烦,先出一个比较简单可用的单代版本,后续会优化
内存布局
小型Region(Small Region)
容量固定为2MB
用于放置小于256KB的小对象
中型Region(Medium Region)
容量固定为32MB
用于放置大于等于256KB但小于4MB的对象
大型Region(Large Region)
容量不固定
可以动态变化, 但必须为2MB的整数倍, 用于放置4MB或以上的大对象
每个大型Region中只会存放一个大对象
它的实际容量完全有可能小于中型Region, 最小容量可低至4MB
ZGC运作过程
并发标记(Concurrent Mark)
并发预备重分配(Concurrent Prepare for Relocate)
并发重分配(Concurrent Relocate)
颜色指针
每个对象有一个64位指针,
18位:预留给以后使用;
1位:Finalizable标识
并发引用处理
表示这个对象只能通过finalizer才能访问
1位:Remapped标识
此位的值后,对象未指向relocation set中(relocation set表示需要GC的Region集合)
1位:Marked1标识
标记对象用于辅助GC
GC周期1:使用mark0
周期结束所有引用mark标记都会成为01
1位:Marked0标识
标记对象用于辅助GC
GC周期2:使用mark1
待的mark标记10,所有引用都能被重新标记
42位:对象的地址
可以支持2^42=4T内存
GC后对象指针分析我们可知,对象指针必须是64位,那么ZGC就无法支持32位操作系统,同样的也就无法支持压缩指针了(CompressedOops,压缩指针也是32位)
优势
可以大幅减少在垃圾收集过程中内存屏障的使用数
具备强大的扩展性
记录更多对象标记
记录更多重定位过程
一旦某个Region的存活对象被移走之后,这个Region立即就能够被释放和重用掉,而不必等待整个堆中所有指向该Region的引用都被修正后才能清理
ZGC存在的问题
最大的问题是浮动垃圾
解决方案
增大堆的容量,使得程序得到更多的喘息时间
引入分代收集,让新生对象都在一个专门的区域中创建,然后专门针对这个区域进行更频繁、更快的收集
触发时机
定时触发
默认为不使用,可通过ZCollectionInterval参数配置
预热触发
最多三次,在堆内存达到10%、20%、30%时触发
主要时统计GC时间,为其他GC机制使用
分配速率
基于正态分布统计,计算内存99.9%可能的最大分配速率,以及此速率下内存将要耗尽的时间点,在耗尽之前触发GC(耗尽时间 - 一次GC最大持续时间 - 一次GC检测周期时间)
主动触发
默认开启,可通过ZProactive参数配置
距上次GC堆内存增长10%,或超过5分钟时,对比距上次GC的间隔时间跟(49 * 一次GC的最大持续时间),超过则触发
0 条评论
下一页