前言
这是一本关于垃圾回收(Garbage Collection,GC)的书。为什么要写一本关于垃圾回收的书呢?
首先,垃圾回收对应用影响很大,主要表现在应用停顿时间、吞吐量、资源使用等方面,开发者选择一种语言时考虑的一个重要因素就是该语言是否支持垃圾回收以及支持哪些垃圾回收实现(要综合考虑开发难度、效率和运行效率)。
其次,Hotspot是最流行的Java虚拟机(Java Virtual Machine,JVM。本书使用JVM指代Hotspot虚拟机),垃圾回收是Java虚拟机最重要的组成部分,也是最复杂的部分之一。以JDK 8为例,共计支持5种垃圾回收实现,提供了超过800个可以调整的参数,其中与垃圾回收相关的参数超过400个。这么多参数给用户理解和使用垃圾回收算法带来了很大困难。
目前已经有众多书籍和文章介绍JVM中垃圾回收的相关知识,为什么还要再写一本与垃圾回收相关的书呢?最主要的原因是笔者希望以实际产品为例,介绍垃圾回收的原理、实现以及使用,帮助读者解决Java工程师日常工作中遇到的常见问题。例如:
1)垃圾回收原理过于抽象,原理和实现存在不少差距。不同的虚拟机在实现一款垃圾回收算法时,由于应用场景不同,或者设计目标不同,最终会采用不同的实现方法,而不同的实现方法会给用户正确、合理地使用虚拟机造成影响。
2)垃圾回收调优过于依赖经验。根据资料或者文档,可以通过JVM参数调整解决一些问题,但是很少有资料系统化地介绍为什么调整参数能够解决问题,以及调整参数后引起的潜在问题是什么。
3)垃圾回收实现与硬件的关系。垃圾回收算法是通用算法,与具体硬件平台无关。但是JVM作为跨平台的实现,需要考虑如何利用不同硬件的特性,最大化地提高应用运行性能。最为典型的代表是部分硬件提供的弱内存顺序模型,需要虚拟机在正确性和性能之间取得平衡,而这也是虚拟机中垃圾回收实现的难点和重点。
本书涉及部分垃圾回收的理论知识,但更关注工程实践。希望通过对实现的分析,让读者了解如何实现一款“令人满意”的垃圾回收器。“令人满意”通常是指满足业务诉求,并且综合考虑停顿时间、吞吐量、资源消耗、实现复杂度、稳定性等性能要求。
本书共分为4部分:
- 第一部分介绍虚拟机执行的基础知识以及垃圾回收的相关知识。
- 第二部分介绍JVM中实现的6种垃圾回收算法。
- 第三部分介绍JVM提供的用于控制垃圾回收算法的参数。
- 第四部分以鲲鹏920为例介绍ARM服务器以及在ARM服务器下如何实现GC才能充分发挥硬件性能。
建议读者从第一部分开始阅读,在阅读第二部分相关章节时可以结合第三部分对应章节提供的参数说明理解相关原理、实现,并掌握参数的使用方法。第四部分作为扩展内容,适合对JVM实现感兴趣的读者阅读。
本书讨论JVM实现的垃圾回收器,介绍了JVM在JDK 8、JDK 11和JDK 17中实现的6种垃圾回收器,为了扩展读者的知识,部分章节中增加了扩展阅读内容,并与其他的Java虚拟机(例如OpenJ9、Android Runtime)中的实现做了比较,或者对JVM实现中的一些方法进行了总结和整理。在介绍相关原理和实现时,本书使用了较多图示,图示通常与具体的JDK版本无关,参考JDK 8、JDK 11或者JDK 17任意一个版本均可,和版本相关的特殊图示会在正文中说明。
由于编写水平有限,书中难免存在一些疏漏,恳请读者批评指正。你可以通过https://github.com/chenghanpeng/jdk17/issues提交issue,期待能够得到读者朋友们的真情反馈,在技术道路上互勉共进。
在本书的写作过程中,得到了很多朋友及同事的帮助和支持,在此表示衷心的感谢!
感谢机械工业出版社华章分社各位编辑的支持和鼓励,在我写作过程中给出了非常多的意见和建议,并不厌其烦认真地同我沟通,力争使文字清晰、准确、无误。感谢你们的耐心,向你们的专业精神致敬!
感谢我的家人,有了你们的支持和帮助,我才有时间和精力去完成写作。