前言
JDK 11于2018年9月25日正式发布,这个版本引入了许多新的特性,其中最为引人注目的就是实现了一款新的垃圾回收器ZGC。Java开发人员日常工作中最关注、接触最多的就是JVM中的垃圾回收器,所以该垃圾回收器一经发布,立即吸引了大量开发人员的目光。在JDK 11中,ZGC被明确标记为实验性质(意味着还不成熟),这样一款尚不成熟的垃圾回收器为什么能合入OpenJDK的官方项目中?它对以前的垃圾回收器的改进体现在哪里?它的创新点是什么?它的不足有哪些?本书尝试从ZGC的代码出发,分析ZGC的设计和实现,希望能找到上述问题的答案。
ZGC是一款开源的垃圾回收器,本书从原理和代码角度对ZGC进行剖析,与大家一起学习ZGC,并希望通过本书的介绍让更多的人认识和使用它,也希望大家在学习的过程中都能理解、掌握、精通ZGC,并能在社区中贡献自己的力量。
本书共分为10章:
❑第1章介绍JVM中实现的垃圾回收器,其中着重介绍了G1,最后介绍了ZGC对G1的改进以及当下ZGC尚需完善之处。
❑第2章首先介绍内存地址多视图映射,然后介绍ZGC中的物理内存和虚拟内存,以及它们的管理,最后介绍ZGC如何分配对象。
❑第3章主要介绍ZGC中涉及的四大控制线程:ZDirector负责垃圾回收的触发,ZDriver负责垃圾回收的执行,ZStat负责收集统计信息,VMThread负责控制进行STW操作。
❑第4章介绍ZGC如何利用地址多视图映射设计并发算法进行并发标记、并发转移和并发重定位。
❑第5章介绍ZGC垃圾回收过程的10个步骤以及每一步所做的工作,同时给出了算法示例图演示整个垃圾回收的过程。
❑第6章分析一个完整的ZGC运行日志,并针对每一行日志进行解释,为读者了解ZGC的运行情况提供帮助。
❑第7章首先介绍ZGC中最常用的参数,包括ZGC新引入的参数、ZGC重用的通用GC参数,然后介绍分别使用G1和ZGC作为垃圾回收器运行Cassandra和YCSB,从停顿时间和吞吐率两个方面比较ZGC和G1的运行效果。
❑第8章主要介绍ZGC目前存在的不足以及未来的发展方向。
❑第9章介绍两种调试方法:根据源代码编译后使用GDB调试JVM,着重介绍ZGC垃圾回收过程的调试;根据HotSpot Debugger工具对运行的Java程序进行分析。
❑第10章对Shenandoah进行简要介绍。Shenandoah在JDK 12中作为实验项目加入OpenJDK,它和ZGC的定位非常类似,但实现方法并不相同。该章简单地介绍Shenandoah和G1、ZGC之间的区别,Shenandoah垃圾回收触发的策略以及Shenandoah实现的几种垃圾回收算法。
本书主要基于JDK 11源代码进行分析,所用的版本是jdk11u1,读者可以自行到OpenJDK的官网下载,也可以从笔者在GitHub(https://github.com/chenghanpeng/jdk11u)的备份中下载。
在本书中,为了能够让读者更加清晰、直观地了解一些基本概念,笔者设计了一些样例程序,这些样例代码可以从仓库(https://github.com/chenghanpeng/jdk11u/tree/master/example)中下载。另外,本书介绍了ZGC在JDK 12中的新功能——类回收,为了便于读者学习研究,笔者也维护了一份JDK 12的源代码(https://github.com/chenghanpeng/jdk12),供感兴趣的读者下载。
最后再强调一点,ZGC处于持续迭代开发中,变化也会很快。为了能够深入探索ZGC,希望读者在阅读本书时要始终抱着质疑的态度,不断地问自己:书中的介绍和解释是否正确?ZGC的实现是否有改进的空间?如果有该如何改进?只有不断地提出问题、解决问题,才能深入理解和运用ZGC。
由于笔者水平有限,时间仓促,书中难免存在错漏之处,恳请读者批评指正。你可以通过https://github.com/chenghanpeng/jdk11u/issues提交问题。期待能够得到读者朋友们的真情反馈,在技术道路上互勉共进。
在创作本书的过程中,得到了很多朋友以及同事的帮助和支持,在此表示衷心的感谢!
感谢策划编辑吴怡的支持和鼓励,她不仅给出了非常多的写作意见和建议,还不厌其烦地、认真地和笔者沟通,力争做到清晰、准确、无误地将内容呈现给读者。
感谢我的家人,特别是我的儿子,能够体谅我牺牲了陪伴他的时间。有了他们的支持和帮助,我才有时间和精力去完成写作。