为Java开疆拓土的ZGC深度剖析

ZGC介绍

ZGC(The Z Garbage Collector)是JDK11中推出的一款追求极致低延迟的垃圾收集器,设计目标包括如下:

1、停顿时间不超过10ms,JDK16已经达到不超过1ms。

2、停顿时间不会随着堆的大小,或者活跃对象的大小而增加。

3、支持8MB~4TB级别的堆,JDK15后已经可以支持16TB。

这么去想,如果使用ZGC来做JAVA项目,像游戏系统、对STW敏感的证券系统都可以用Java来做(目前都是C或者C++的市场),所以ZGC的出现就是为了抢占其他语言的市场。

ZGC内存布局

为了细粒度的控制内存的分配,和G1垃圾收集器一样,ZGC讲内存划分为小的分区,在ZGC中称为页面(page),ZGC中没有新生代、老年代分代的概念。ZGC支持3种页面,分别为小页面、中页面和大页面。其中小页面指的是2MB的页面空间,中页面指32MB的页面空间,大页面指受操作系统控制的大页。

当对象大小小于等于256KB时,对象分配在小页面。

当对象大小在256KB和4MB之间,对象分配在中页面。

当对象大于4MB,对象分配在大页面。

ZGC支持NUMA

在过去,对于X86架构的计算机,内存控制器还没有整合进CPU,所有对内存的访问都需要通过北桥芯片来完成,X86系统中的所有内存都可以通过CPU进行同等访问。任何CPU访问任何内存的速度是一致的,不必考虑不同 内存地址之间的差异,这称为“统一内存访问”(Uniform Memory Access,UMA)。UMA系统架构示意图如下所示:

在UMA中,各处理器与内存单元通过互联总线进行链接,各个CPU之间没有主从关系。之后的X86平台经历了从“拼频率”到“拼核心数”的转变,越来越多的核心被尽可能地塞进同一块芯片上,各个核心对于内存带宽的争抢访问成为瓶颈,所以人们希望能够把CPU和内存集成到一个单元上(称Socket),这就是非统一内存访问(Non-Unifor Memory Access,NUMA)。很明显在NUMA下,CPU访问本地存储器的速度比访问非本地存储器快一些。下图所示是支持NUMA处理器脚骨示意图:

ZGC是支持NUMA的,在进行小页面分配时会优先从本地内存分配,当不能分配时才会从远端的内存分配。对于中页面和大页面的分配,ZGC并没有要求从本地内存分配,而是直接交给操作系统,由操作系统找到一块能满足ZGC页面的空间。ZGC这样设计的目的在于,对于小页面,存放的都是小对象,从本地内存分配速度很快,且不会造成内存使用的不平衡,而中页面和大页面因为需要的空间大,如果也优先从本地内存分配,极易造成内存使用不平衡,反而影响性能。

ZGC的核心概念指针着色技术

颜色指针是ZGC的核心概念,因为它在指针中借了几个位出来,所以必须要64位的机器上可以工作,并且因为要求64位指针,所以不能压缩指针,ZGC中低42位表示使用的堆空间,借几位高位来快速实现垃圾回收中的并发标记、转移、重定位等。

 

ZGC的工作流程

 0、初始阶段:在ZGC初始化之后,此时地址视图为Remapped,程序正常运行,在内存中分配对象,满足一定条件后垃圾回收启动。

1、初始标记:这个阶段需要STW,初始标记值需要扫描所有的GC Roots,其处理时间和GC Roots的数量成正比,停顿时间不会随着堆的大小或者活跃对象的大小而增加。

2、并发标记:这个阶段不需要STW,扫描剩余的所有对象,这个处理时间比较长,所以走并发,业务线程与GC线程同时运行。但是这个阶段会产生漏标问题。

3、再标记:这个阶段需要STW,主要处理漏标对象,通过SATB算法解决。

4、并发转移准备:分析最有价值GC分页,不需要STW。

5、初始转移:转移初始标记的存活对象同时做对象重定位,需要STW。

6、并发转移:对转移并发标记的存活对象做转移,为STW。

ZGC如何做到并发转移

转发表(类似于HashMap)

对象转移和插转发表做原子操作

 并发标记对象的重定位

下次GC中的并发标记,会同时做上次GC并发标记对象的重定位,利用指针着色中M0和M1区分。

 ZGC中读屏障

是JVM向应用代码插入一小段代码的技术,当应用线程从堆中读取对象引用时,就会执行这段代码,需要注意的是,仅从堆中读取对象引用才会触发这段代码。涉及到的对象是并发转移但还没有做对象重定位的对象,着色指针使用M0和M1区分,触发的时机是在两次GC之间业务线程访问这样的对象。触发的操作是对象重定位+删除转发表记录是一个原子操作。

ZGC典型应用场景

1、超大堆应用,百G以上,CMS或者G1如果发生Full GC,停顿会在分钟级别,可能会造成业务的中断,强烈推荐使用ZGC。

2、当业务应用需要提供高服务级别协议,例如99.99%的响应时间不能超过100ms,此类应用无论堆大小,均推荐采用低停顿的ZGC。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值