前几年,图灵在 R 大( RednaxelaFX /莫枢)的大力推荐下,引进了一本日系技术书《垃圾回收的算法与实现》(下文简称 GC 书),一直关注图灵的读者可能对这本书还有些印象。

enter image description here

GC 书分为“算法篇”和“实现篇”两大部分,介绍了标记-清除算法等 9 种重要的 GC 基础算法,以及 GC 在 Python 等 4 种语言处理程序中的具体实现。

用 R 大的话说,这本书非常适合用于入门——它既系统地介绍了 GC 的经典基础算法(及其若干变种),又贴近现实剖析了一些实用系统中的 GC 实现,在抽象与具体,理论与实现之间找到了一个不错的平衡。

GC 书实现篇的作者是中村成洋。他因为偶然的机会对 GC 产生浓厚兴趣,本人却说不清为何喜欢 GC。被人追问原因时,总是回答“是缘分”。

中村成洋
enter image description here

中村是 CRuby 的 committer,现在仍每天致力于 GC 的改善。

在 GC 书的原稿中,有一章是关于“HotSpotVM 的实现”,但因为时间关系,没来得及出版。GC 书正式出版后,中村才继续写作这部分。

一开始,他计划只介绍 G1GC 的实现,但是在写作过程中渐渐改变了想法,觉得还是先写一些算法原理更有助于读者理解,所以又开始埋头写 G1GC 的算法原理。

于是,就有了今天我们要介绍的这本《深入 Java 虚拟机:JVM G1GC 的算法与实现》。

enter image description here

和 GC 书一样,这本书由“算法篇”和“实现篇”两大部分构成。

在算法篇中,这本书探讨了 OpenJDK 7 中引入的 GC 算法——G1GC(Garbage First Garbage Collection)的原理。G1GC 中有一个很大的谜团,那就是 GC 暂停处理的预测暂停时间。算法篇用了数十页的篇幅来揭示它。

关于 G1GC 的资料,具有代表性的是由 David Detlefs 等人所写的英语论文 Garbage-First GarbageCollection。但是那篇论文非常深奥晦涩,只读一遍是无法透彻理解的。

中村初次接触那篇论文是在 2007 年。当时他的英语阅读能力有限,也不怎么了解 GC,所以没读多少就放弃了。3 年后,他掌握了一定程度的 GC 知识,所以再次挑战了那篇论文——结果仍然没能彻底理解。

在那之后的半年多里,中村读完论文读源码,读完源码又去读论文,如此反复,终于彻底理解了全部内容。对于他来说,理解 G1GC 的过程可以称得上“荆棘之路”。

《深入 Java 虚拟机》的算法篇,比原始论文更加详细地介绍了 G1GC 的算法原理和执行过程。对于自己以前理解起来比较困难的地方,中村还特意进行了详细的说明,因此内容要比原始论文易于理解。即使是不太了解 GC 的读者,理解起来也没有什么问题。

在实现篇中,中村又详细剖析了 HotSpotVM 的源码。

HotSpotVM 实现了包括 G1GC 在内的多种 GC 算法。不过这些算法并非凭空而来,而是基于 HotSpotVM 中专为 GC 算法设计的框架实现的。因此,中村会带大家去了解作为框架之一的对象管理功能。得益于对象管理功能的接口,多种 GC 算法之间的切换成为可能,而且新 GC 算法的添加也变得更加简单。

之后,大家还会了解对象的数据结构和内存分配器。有关分配器的讲解会稍微涉及对操作系统的调用。

除此以外,大家还将了解 G1GC 中用到的线程管理方法。HotSpotVM 内部同样也有能够在 GC 过程中简单地操作线程的框架,各种 GC 算法都是通过这个框架来实现并行 GC 和并发 GC 的。

再后面就是 G1GC 的具体实现,讲解了 G1GC 的并发标记和转移,以及调度程序的实现。这部分尽量省略了算法篇中已经详细讲解过的内容,着重讲解前面没有涉及的内容。

对于 G1GC,中村曾有过不少疑问。比如“G1GC 是如何实现准确式 GC 的”和“实现了这么多 GC 不会导致写屏障变慢吗”,等等。因此,他研究了 G1GC 的实现方式,并将得到的结果放在了本书的最后两章。

中村写作本书的目的在于将他走过的“荆棘之路”变成更多人易于踏上的坦途。希望各位读者轻松愉快地走过这条坦途,用最短的时间掌握 G1GC。

| 图书特色

  • 图文并茂
    这本书带点图解系列的风格,特别是算法篇,清晰的配图让 GC 过程更直观、易懂。

    转移专用记忆集合的构造 enter image description here
    GC 单位时间内的 GC 暂停时间上限 enter image description here
    mutator 和 GC 的执行关系 enter image description here

  • 通俗易懂
    中村在写作中不仅融入了自己的独到见解和研究成果,还巧用“打比方”的手法深入浅出。比如在讲解 Java 监视器时,中村将其比喻为滑雪板租赁商店,在后面讲解监视器的实现时也一直使用这个例子帮助读者加深理解。

    监视器与租赁商店
    enter image description here

  • 源码剖析
    算法篇剖析 HotSpotVM 源码时,只列出主流程的代码,并附上细致解释,易读性高。

    ConcurrentMark 类的实现
    enter image description here

  • 生动有趣
    书中专栏插入了几幅中村自己画的小漫画,灵魂画风,却极其传神。

    保守式 GC(不能识别指针和非指针的 GC)与准确式 GC(能够正确识别指针和非指针的GC) enter image description here

| 读者对象

这本书适合所有对 JVM、GC 和 JDK 内存管理感兴趣的读者阅读。

这本书可以说是对 GC 书的补充,弥补了 GC 书未深入讲解并行 GC/并发 GC,未涉及 JVM GC 的不足,相对来说更加贴合 Java 从业者。只要读过 GC 书,应该就能理解本书的内容。

不过即使没有读过,只要具备一些 GC 的基础知识,阅读本书也不成问题。具体来说,需要事先掌握标记-清除 GC、复制 GC 和增量 GC 等的基础算法。

如果不具备任何 GC 相关的知识,而且也不打算阅读 GC 书,那么建议先自己在网络上简单了解一下 GC。

作为 Javaer 必拜山头之一,JVM 一直带有那么一些神秘感。希望这本书能帮助大家进一步打破这种神秘感,知其然并知其所以然,了解底层又不拘泥于底层,写起代码来更加得心应手。