写点什么

ZGC 新特性

用户头像
meacial
关注
发布于: 1 小时前

随着系统架构、软硬件设施的不断完善发展,更大内存的使用,更高的系统目标,要支持更大的并发、更低的延迟、更大的吞吐量,这个时候,传统的 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


发布于: 1 小时前阅读数: 4
用户头像

meacial

关注

还未添加个人签名 2020.07.13 加入

还未添加个人简介

评论

发布
暂无评论
ZGC 新特性