ZGC 新特性
随着系统架构、软硬件设施的不断完善发展,更大内存的使用,更高的系统目标,要支持更大的并发、更低的延迟、更大的吞吐量,这个时候,传统的 GC 已经无法满足需求,新一代 GC - ZGC 便应用而生。
ZGC 是并发垃圾回收器,基于分区(不同于分代垃圾回收),支持空间压缩,同时还引入了 2 个重要的特性,彩色指针和加载屏障
Concurrent
Region-based
Compacting
NUMA-aware
Using colored pointers
Using load barriers
ZGC 能够在更大堆上表现的更好,同时也大大减小了暂停时间
最大暂停时间能控制在亚毫秒以内
暂停时间不会随着堆内存的增加而增加,不会因为活动对象集,Root 对象集的增加而增加
能处理 8MB 到 16TB 大小的堆
什么是彩色指针、加载屏障?
java 对象中 field 的引用,通过指针映射到内存对象,而彩色指针就是在加入了一些属性信息的指针。
而通过指针加载内存对象又受到加载屏障的影响,可以在加载对象之前进行一些操作。
彩色指针带来了很多方面的提升,特别是:
可以让我们在重定位/压缩阶段回收和重用内存,而不需要在一个完整的 gc 中采用标记和压缩算法,同时也降低了一些堆的开销
它允许我们拥有相对较少和简单的 GC 屏障。这有助于降低运行时开销。这也意味着更容易在解释器和 JIT 编译器中实现、优化和维护 GC 屏障代码
我们目前在有色指针中存储标记和重定位相关信息。然而,该方案的多用途特性允许我们存储任何类型的信息(只要我们能将其放入指针中),并让加载屏障根据该信息采取任何它想要的操作。我们相信这将为未来的许多功能奠定基础。举一个例子,在异构内存环境中,这可以用于跟踪堆访问模式,以指导 GC 重新定位决策,将很少使用的对象移动到冷存储中
ZGC 堆模型
ZGC 堆由一组称为 ZPages 的堆区域组成。每个 ZPage 都与一个可变数量的已提交堆内存相关联。当 ZGC 压缩堆时,ZPages 被释放并插入到页面缓存 ZPageCache 中。页面缓存中的 ZPage 可以被重用以满足新的堆分配,在这种情况下,它们将从缓存中删除。页面缓存对于性能至关重要,因为提交和取消提交内存都是代价昂贵的操作。
页面缓存中的 ZPages 集合表示堆中未使用的部分,这些部分可以未提交并返回给操作系统。因此,取消提交内存可以通过简单地从页面缓存中逐出一组精心选择的 ZPage 来完成,并取消提交与这些页面相关的内存。页面缓存已经将 ZPages 按最近最少使用(LRU)的顺序保存,并按大小(小、中、大)分隔,因此逐出 ZPages 和取消提交内存的机制相对简单。挑战在于制定政策来决定何时驱逐
一个简单的策略是使用一个超时或延迟值来指定 ZPage 在被驱逐之前可以在页面缓存中停留多长时间。这个超时应该有一个合理的默认值,用一个命令行选项来覆盖它。Shenandoah GC 使用这样的策略,默认值为 5 分钟,命令行选项-XX:ShenandoahUncommitDelay=<milliseconds>来覆盖默认值。
ZGC 中的 Z 是什么意思呀?
他只是个名字而已,作者命名的灵感来自与 ZFS (动态文件系统,ZFS 出现时在很多方面都是革命性的),所以可以理解为新一代的 GC
ZGC 怎么读呢?
可以读作 "zed gee see" 或者 "zee gee see"
引文
http://openjdk.java.net/jeps/333
http://openjdk.java.net/jeps/377
http://openjdk.java.net/jeps/304
http://openjdk.java.net/jeps/351
https://wiki.openjdk.java.net/display/zgc/Main
版权声明: 本文为 InfoQ 作者【meacial】的原创文章。
原文链接:【http://xie.infoq.cn/article/227f6a9d77b79a1112837743e】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论