ZGC垃圾收集器

ZGC(它的目标就是低延迟)

G1 在大堆的时候可以选择部分收集,所以停顿时间有优势。

ZGC 和 G1 一样是基于 reigon 的,几乎所有阶段都是并发的,整堆扫描,部分收集。而且 ZGC 还不分代,就是没分新生代和老年代。

  1. 并发

  • 只有初始标记、再标记、初始转移阶段是 STW 的。初始标记就扫描 GC Roots 直接可达的,耗时很短,重新标记一般而言也很短,如果超过 1ms 会再次进入并发标记阶段再来一遍。初始转移阶段也是扫描 GC Roots 也很短,所以可以认为 ZGC 几乎是并发的。
  • 停顿时间不会随着堆的大小和存活对象的数量增加而增加,是因为 STW 几乎只和 GC Roots 集合大小有关,和堆大小没啥关系。
  • 不过并发回收有个情况就是回收的时候应用线程还是在产生新的对象,所以需要预留一些空间给并发时候生成的新对象。当对象分配过快导致内存不够, ZGC 则是阻塞应用线程。
  1. 区域(region)

和 G1 一样 ZGC 也将堆划分成很多分区。但是不同的是ZGC的区域具有动态性,动态创建和销毁。

  • 小型region
  • 中型region
  • 大型region
  • 对于回收的策略是优先收集小区,中,大区尽量不回收。
  • ZGC 对 NUMA (非一致内存访问)的支持是小分区分配时会优先从本地内存分配,如果本地内存不足则从远程内存分配。对于中、大分区的话就交由操作系统决定,上述做法的原因是生成的绝大部分都是小分区对象,因此优先本地分配速度较快,而且也不易造成内存不平衡的情况。而中、大分区对象较大,如果都从本地分配则可能会导致内存不平衡的情况。
  • NUMA:把 CPU 和内存集成到一个单元上,简单的说就是把内存分一分,每个 CPU 访问自己的本地的内存比较快,访问别人的远程内存就比较慢。如下图:

  1. 紧凑技术

G1 一样都分区了所以肯定从整体来看像是标记-复制算法,所以也是会整理的。因此 ZGC 也不会产生内存碎片。

  1. 染色指针

染色指针其实就是从 64 位的指针中,拿几位来标识对象此时的情况,分别表示 Marked0、Marked1、Remapped、Finalizable。

  • 0-41 这 42 位就是正常的地址(对象地址),所以说 ZGC 最大支持 4TB (理论上可以16TB)的内存,因为就 42 位用来表示地址。也因此 ZGC 不支持 32 位指针,也不支持指针压缩。
  • 然后用 42-45 位来作为标志位,其实不管这个标志位是啥指向的都是同一个对象,这是通过多重映射来做的,很简单就是多个虚拟地址指向同一个物理地址,不过对象地址是 0001.... 还是0010....还是0100..... 对应的都是同一个物理地址即可。
  • 不过这里先提个问题,为什么就支持 4TB,不是还有很多位没用吗?首先 X86_64 的地址总线只有 48 条(即寻址范围为2 的48次方),所以最多其实只能用 48 位,指令集是 64 位没错(64位为指令位数,可一般为操作码和地址吗),但是硬件层面就支持 48 位。因为基本上没有多少系统支持这么大的内存,那支持 64 位就没必要了,所以就支持到 48 位。那现在对象地址就用了 42 位,染色指针用了 4 位,不是还有 2 位可以用吗?是的,理论上可以支持 16 TB,不过暂时认为 4TB 够了,所以暂做保留,仅此而已没啥特别的含义。
  1. 读屏障

写屏障是在对象引用赋值时候的 AOP,而读屏障是在读取引用时的 AOP。

  • 比如 Object a = obj.foo;,这个过程就会触发读屏障。
  • GC 线程转移对象之后,应用线程读取对象时,可以利用读屏障通过指针上的标志来判断对象是否被转移。如果是的话修正对象的引用,按照上面的例子,不仅 a 能得到最新的引用地址,obj.foo 也会被更新,这样下次访问的时候一切都是正常的,就没有消耗了。

ZGC收集过程:参考深入理解jvm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值