Java 11 的特性集合已经确定, 其中包含了一些非常棒的特性. 新版本提供了一个全新的垃圾回收器 ZGC, 它由甲骨文开发, 承诺在 TB 级别的堆上实现非常低的停顿时间. 在本文中, 我们将介绍甲骨文开发 ZGC 的动机, ZGC 的技术概览以及 ZGC 带来的一些非常令人兴奋的可能性.
那么为什么要开发 ZGC? 毕竟 Java 10 中已经带有 4 款久经考验的垃圾回收器. Hotspot 最新的垃圾回收器 G1 是在 2006 年推出的. 当时最大的 AWS 实例是 m1.small, 配备 1 个 vCPU 和 1.7GB 内存, 而到了今天, AWS 提供了 x1e.32xlarge 实例, 配备了 128 个 vCPU 和令人难以置信的 3,904GB 内存. ZGC 所针对的是这些在未来普遍存在的大容量内存: TB 级别的堆容量, 具有很低的停顿时间 (小于 10 毫秒), 对整体应用性能的影响也很小(对吞吐量的影响低于 15%).ZGC 所采用的机制也可以在未来进行扩展, 以支持一些令人兴奋的特性, 如多层堆(用于热对象的 DRAM 和用于低频访问对象的 NVMe 闪存) 或压缩堆.
GC 术语
要了解 ZGC 在现有垃圾回收器中所处的位置, 以及它是如何达到这个位置的, 我们先需要先了解一些术语. 最基本的 GC 包括识别出不再使用的内存, 并将其变为可用的. 现代垃圾回收器通常分几个阶段来完成回收过程, 如下所示:
并行(Parallel)-- 运行中的 JVM 包含应用程序线程和 GC 线程. 在并行阶段, 会运行多个 GC 线程, 也就是说任务被拆分给它们去完成. 至于 GC 线程是否可以与正在运行的应用程序线程重叠, 这个在规范中并没有特别说明.
串行(Serial)-- 串行阶段只有单个 GC 线程在运行. 与上面的并行阶段一样, 规范中也没有说明 GC 线程是否可以与当前运行的应用程序线程重叠.
Stop The World(STW)-- 在这个阶段, 应用程序线程被暂停, 让 GC 线程执行它们的任务. 当你遇到 GC 停顿时, 说明虚拟机进入了 STW 阶段.
并发(Concurrent)-- 在并发阶段, GC 线程可以在运行应用程序线程的同时执行自己的任务. 并发阶段非常复杂, 因为应用程序线程有可能在 GC 完成之前将其中断.
增量(Incremental)-- 在增量阶段, 它可以运行一段时间, 并基于某些条件提前终止, 例如时间预算或执行更高优先级的 GC 阶段.
权衡取舍
- void printName( Person person ) {
- String name = person.name; // 将会触发加载屏障, 因为从堆中加载了一个引用
- System.out.println(name); // 没有直接使用加载屏障
- }
来源: http://www.infoq.com/cn/articles/oracle-release-java-gc-zgc