猜你喜欢
新一代垃圾回收器ZGC设计与实现

新一代垃圾回收器ZGC设计与实现

书籍作者:彭成寒 ISBN:9787111633655
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:4562
创建日期:2021-02-14 发布日期:2021-02-14
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介
Java 11版本包含一个全新的垃圾收集器ZGC,它由Oracle开发,承诺在数TB的堆上具有非常低的暂停时间。ZGC是2017年Oracle公司贡献给OpenJDK社区的,正式成为OpenJDK的开源项目。ZGC 所针对的是这些在未来普遍存在的大容量内存:TB 级别的堆容量,具有很低的停顿时间(小于 10 毫秒),对整体应用性能的影响也很小(对吞吐量的影响低于 15%)。ZGC 所采用的机制也可以在未来进行扩展,以支持一些令人兴奋的特性,如多层堆(用于热对象的 DRAM 和用于低频访问对象的 NVMe 闪存)
或压缩堆。
本书详细介绍ZGC涉及的基本概念和运行原理,以及调优方法。主要内容共9章,主要
内容有:垃圾回收器概述、ZGC内存管理、ZGC线程、ZGC垃圾回收算法的设计、ZGC日
志解读、ZGC参数和基准测试、ZGC的编译调试、ZGC特性总结和展望、ZGC的编译调试、Shenandoah简介等。
作者简介
彭成寒 高级Java工程师,目前主要从事风控系统设计、算法建模、大数据处理等工作,有超过10年的Java和C++开发经验。
编辑推荐
适读人群 :软件开发人员
自Java中引入垃圾回收器以来,垃圾回收器的发展从未停止过。JDK 11引入了一款新的垃圾回收器——ZGC。
本书尝试对ZGC的算法实现进行分解,用大量图片展示了ZGC内部的运行原理,逐步揭开垃圾回收器算法的内幕,然后再给出调优方法。
前言
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提交问题。期待能够得到读者朋友们的真情反馈,在技术道路上互勉共进。
在创作本书的过程中,得到了很多朋友以及同事的帮助和支持,在此表示衷心的感谢!
感谢策划编辑吴怡的支持和鼓励,她不仅给出了非常多的写作意见和建议,还不厌其烦地、认真地和笔者沟通,力争做到清晰、准确、无误地将内容呈现给读者。
感谢我的家人,特别是我的儿子,能够体谅我牺牲了陪伴他的时间。有了他们的支持和帮助,我才有时间和精力去完成写作。
目录
前言
第1章 垃圾回收器概述 1
1.1 垃圾回收算法 2
1.2 JVM垃圾回收器 2
1.2.1 串行回收 3
1.2.2 并行回收 4
1.2.3 CMS 4
1.2.4 G1 5
1.2.5 ZGC 15
1.2.6 Shenandoah 19
第2章 ZGC内存管理 21
2.1 操作系统地址管理 21
2.2 ZGC内存管理 22
2.2.1 多视图映射 25
2.2.2 ZGC多视图映射 27
2.2.3 页面设计 30
2.2.4 对NUMA的支持 31
2.2.5 ZGC中的物理内存管理 32
2.2.6 ZGC中的虚拟内存管理 34
2.2.7 ZGC内存预分配 35
2.3 ZGC对象分配管理 36
2.3.1 对象空间分配 39
2.3.2 页面分配 42
第3章 ZGC线程 48
3.1 线程的基本概念 48
3.2 控制线程 49
3.2.1 时钟触发器 51
3.2.2 消息触发 53
3.2.3 VMThread 56
3.3 工作线程 59
3.4 垃圾回收触发的时机 62
第4章 ZGC垃圾回收算法的设计 67
4.1 并发垃圾回收算法 67
4.1.1 并发垃圾回收算法概述 67
4.1.2 ZGC并发算法的设计 68
4.2 并发处理 70
4.2.1 并发处理概述 71
4.2.2 ZGC并发处理算法 73
4.2.3 ZGC并发处理算法演示 75
第5章 ZGC垃圾回收算法的实现 78
5.1 垃圾回收的实现 78
5.1.1 初始标记 78
5.1.2 并发标记 88
5.1.3 再标记和非强根并行标记 94
5.1.4 非强引用并发标记和引用并发处理 98
5.1.5 重置转移集 105
5.1.6 回收无效的页面 106
5.1.7 选择待回收的页面 106
5.1.8 初始化待转移集合的转移表 108
5.1.9 初始转移 108
5.1.10 并发转移 110
5.1.11 垃圾回收算法再讨论 111
5.2 垃圾回收算法演示 112
第6章 ZGC日志解读 120
6.1 Xlog简介 120
6.2 测试用例设计 123
6.3 ZGC初始化信息 125
6.4 垃圾回收触发信息 127
6.5 垃圾回收过程中每一步的信息 130
6.6 统计信息 137
6.6.1 垃圾回收器信息 137
6.6.2 竞争信息 137
6.6.3 同步等待信息 139
6.6.4 内存信息 140
6.6.5 垃圾回收步骤信息 142
6.6.6 子阶段信息 144
6.6.7 线程信息 146
第7章 ZGC参数和基准测试 147
7.1 参数简介 147
7.1.1 ZGC新引入参数 147
7.1.2 GC通用参数 149
7.2 测试评估 150
7.2.1 测试准备 151
7.2.2 测试与测试报告 154
第8章 ZGC的发展与展望 160
8.1 类回收 161
8.2 单代回收 164
8.3 新功能和多平台 165
第9章 JVM编译调试 166
9.1 下载源代码 166
9.2 代码概览 167
9.3 编译JVM 168
9.4 调试ZGC 169
9.4.1 启动GDB 170
9.4.2 对象分配 170
9.4.3 触发垃圾回收 172
9.4.4 初始标记 172
9.4.5 并发标记 173
9.4.6 初始转移 174
9.4.7 并发转移 176
9.4.8 重定位 176
9.5 使用HSDB学习JVM中对象布局 178
9.5.1 C++对象布局原理 178
9.5.2 Java对象布局原理 180
9.5.3 用HSDB分析Java对象布局 180
第10章 Shenandoah简介 192
10.1 概述 192
10.2 Shenandoah垃圾回收策略 193
10.3 Shenandoah垃圾回收算法 194
10.3.1 正常回收算法 195
10.3.2 遍历回收算法 197
附录A Cassandra简介 200
附录B YCSB简介 202