来聊一聊ZGC

1. G1中仍然存在的STW问题

G1的混合回收过程可以分为标记阶段、清理阶段和复制阶段。而其中的清理阶段仍然是STW的,这也是G1中STW耗时最长的操作。那么,G1为什么不能将这个耗时的STW清理改为并发清理吗?

以下是G1的结构,之前的文章有讲解,这里直接带过。

答案是确实不能,G1使用的是标记-复制算法,首先进行标记阶段并标记活动对象,然后将活动对象复制到另一个Region,然后将垃圾对象以及移动前的对象标记为清除。标记-复制算法能很好的压缩因垃圾回收产生的内存碎片,但是,这也意味着,如果垃圾回收线程和应用线程并行时,回收线程对活跃对象的移动会导致应用线程无法正确的找到复制后的地址,造成并发问题。

ZGC用的也是标记-复制算法,但是,其依靠读屏障+地址映射表避免了活跃对象移动导致的寻址异常问题,因此可以并发清理,大大降低了STW时间。

2. 读屏障+地址映射表

读屏障是JVM向应用代码插入一小段代码的技术。当应用线程从堆中读取对象引用时,就会执行这段代码。

ZGC中读屏障的代码作用:在对象标记和转移过程中,用于确定对象的引用地址是否满足条件,并作出相应动作。

ZGC中也有与G1类似的一个个Region结构。当一个Region中的对象要被转移到新的Region中时,会在该Region的地址映射表中维护一个新老地址间的映射。

当应用线程访问每个被垃圾回收线程移动的对象时,该读请求首先会被读屏障拦截,之后会根据地址映射表中的关系,将访问请求路由到新的地址。

3. 染色指针

ZGC中还引入了染色指针技术,要了解为什么有染色指针技术,我们需要先理解可达性分析中的三色标记法。

在ZGC之前的垃圾回收算法中,GC相关的信息都是存放在对象头中的,因此在垃圾回收的过程中,线程必须从堆中先读出对象头中GC相关的信息,才能进行垃圾回收状态的判断。那么,能不能在这上面提效呢?

ZGC的答案是可以的,ZGC不是用对象头,而是直接用指针中的三个Bit位来标记GC的黑白灰三色,这样,在进行可达性分析时,线程就无需读取对象信息,直接通过指针就完成了可达性的判断。

标签:

后端面试Java

话题:

金石计划征文活动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值