full gc 次数_GC算法 - ZGC

【引言】说实话,网上关于ZGC的资料确实不是很多,所以暂时会以零散的知识点的方式对ZGC进行总结。

  • ZGC是一个单代的垃圾回收器,并不像其他的垃圾回收器那样分代;
  • ZGC是一个region-based,也就是说ZGC是按照region来进行划分的; ZGC中的region又被叫做ZPages。
  • 着色指针:64位的指针中,拿出4bit用来标示当前对象GC的状态。在进行指针读取的时候,如果发现标记为是bad color,则需要通过slow path的方式把指针修正为good color。

986c385bad23b6735fd702064deced69.png
着色指针示意图
  • load barriar :应该翻译为读屏障,因为之前的GC算法用的都是写屏障。读屏障的作用就是对移动过的对象指针进行修正。每次「从堆里对象的引用类型中读取一个指针」的时候,都需要加上一个Load Barriers。如果这时候对象在GC时被移动了,接下来JVM就会加上一个读屏障,这个屏障会把读出的指针更新到对象的新地址上,并且把堆里的这个指针“修正”到原本的字段里。这样就算GC把对象移动了,读屏障也会发现并修正指针,于是应用代码就永远都会持有更新后的有效指针,而且不需要STW。

ZGC的回收过程

e92998185d1610410a40cf66d938c1d4.png
ZGC垃圾回收过程示意图
  • 1) Pause Mark Start :和CMS/G1的第一个阶段一样,就是初始化mark GC Roots。主要做Root集合扫描,「GC Root是一组必须活跃的引用,而不是对象」。例如:活跃的栈帧里指向GC堆中的对象引用、Bootstrap/System类加载器加载的类、JNI Handles、引用类型的静态变量、String常量池里面的引用、线程栈/本地(native)栈里面的对象指针等,但不包括GC堆里的对象指针。所以这一步骤的STW时间非常短暂,并且和堆大小没有任何关系。
  • 2)Concurrent Mark/Remap:并发标记阶段,这个阶段在第一步的基础上,继续往下标记存活的对象。并发标记后,还会有一个短暂的暂停(Pause Mark End),确保所有对象都被标记。
  • 3) Concurrent Prepare for Relocate: 即为Relocation阶段做准备,选取接下来需要标记整理的Region集合,这个阶段也是并发执行的。接下来又会有一个Pause Relocate Start步骤,它的作用是只移动Root集合对象引用,所以这个STW阶段也不会停顿太长时间。
  • 4)Concurrent Relocate: 最后,就是并发回收阶段了,这个阶段会把上一阶段选中的需要整理的Region集合中存活的对象移到一个新的Region中(这个行为就叫做「Relocate」,即重新安置对象),如上图所示。Relocate动作完成后,原来占用的Region就能马上回收并被用于接下来的对象分配。
  • 总结: 经过这个几个步骤之后,GC只是把存活对象进行了Relocate。但是Relocate之后在对象进行读操作的时候,对象的位置已经发生了变更。这时候就需要用读屏障来找到对象的真正的位置。

ZGC杂项

  • Use the -XX:+UnlockExperimentalVMOptions -XX:+UseZGC options to enable ZGC.
  • ZGC的强项和特征是GC低延时,代价就是吞度量方面最多可能会降低15%。但是吞度量的降低可以通过水平扩展来分分钟弥补过来。所以如果你的应用对于响应时间特别敏感的话,选择ZGC是最理想的,但是最好也不要让CPU的使用率超过70%。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值