猜你喜欢
深入探索JVM垃圾回收

深入探索JVM垃圾回收

书籍作者:彭成寒 ISBN:9787111708773
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:6984
创建日期:2023-05-02 发布日期:2023-05-02
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

本书介绍JVM和垃圾回收基础知识、垃圾回收原理和实现、JVM垃圾回收的参数、ARM服务器上的GC优化和调整,涉及部分垃圾回收的理论知识,但更关注工程实践。希望通过对实践的分析,让读者了解如何实现一款“令人满意”的垃圾回收器,即满足业务诉求,在停顿时间、吞吐量、资源消耗、实现复杂度、稳定性等方面进行了折中的垃圾回收器。


全书共分为四个部分:
第1部分,介绍虚拟机执行的基础知识以及垃圾回收的相关知识;
第2部分,介绍JVM中实现的六种垃圾回收算法;
第3部分,介绍JVM提供了哪些参数用于控制垃圾回收的运行;
第4部分,以鲲鹏920为例介绍ARM服务器以及在ARM服务器下如何实现GC才能充分发挥硬件的性能。

作者简介

彭成寒
虚拟机技术专家,目前主要从事JVM、V8和WebAssembly等虚拟机的研究和开发。他有超过15年的工作经验,从事过应用软件、大数据开发等工作。他是开源社区OpenEuler技术委员会委员,负责Compiler SIG;还是毕昇JDK的主要维护者和贡献者,著有《JVM G1源码分析和调优》《新一代垃圾回收器ZGC设计与实现》。

编辑推荐
适读人群 :Java程序员、运维人员等

垃圾回收原理过于抽象,垃圾回收调优过于依赖经验,明确垃圾回收实现与硬件之间的关系是学习垃圾回收时所面临的的主要挑战。
本书从工程实践角度,以实际产品为例,全面、系统地介绍JVM和垃圾回收的基础知识、垃圾回收的原理和实现、JVM垃圾回收的参数、ARM服务器上的GC优化和调整,既涵盖垃圾回收的理论知识,又提供大量工程实践案例。

前言

这是一本关于垃圾回收(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任意一个版本均可,和版本相关的特殊图示会在正文中说明。


目录


【第一部分】 Java虚拟机和垃圾回收基础知识

第1章 Java代码执行过程介绍3
1.1 代码执行过程概述3
1.1.1 编译执行4
1.1.2 解释执行4
1.1.3 混合执行4
1.2 从C代码执行过程看编译器和操作系统协同工作5
1.2.1 从源代码到目标代码5
1.2.2 操作系统如何执行目标代码7
1.3 从C++代码的执行过程看编译器支持面向对象语言9
1.3.1 封装支持10
1.3.2 继承支持11
1.3.3 多态支持12
1.4 Java代码执行过程简介13
1.4.1 Java代码到字节码15
1.4.2 JVM加载字节码16
1.4.3 解释执行17
1.4.4 编译执行22
1.5 内存管理26
1.6 线程管理27
1.7 扩展阅读:JIT概述27

第2章 JVM中垃圾回收相关的基本知识30
2.1 GC算法分类30
2.2 GC涉及的对象表示32
2.3 GC算法概述34
2.3.1 复制算法34
2.3.2 标记清除算法36
2.3.3 标记压缩算法37
2.3.4 分代回收38
2.4 GC的根40
2.4.1 强根40
2.4.2 Java引用引入的弱根42
2.4.3 JVM优化实现引入的弱根43
2.4.4 JVM中根的构成45
2.5 安全点46
2.5.1 解释线程进入安全点46
2.5.2 编译线程进入安全点47
2.5.3 本地线程进入安全点48
2.5.4 JVM内部并发线程进入安全点48
2.5.5 安全点小结49
2.6 扩展阅读:垃圾回收器请求内存设计50

【第二部分】 JVM垃圾回收器详解

第3章 串行回收57
3.1 分代堆内存管理概述57
3.1.1 堆设计58
3.1.2 分代边界60
3.1.3 回收设计思路62
3.2 新生代内存管理63
3.2.1 新生代内存分配64
3.2.2 垃圾回收的触发机制67
3.2.3 适用于单线程的复制回收算法69
3.2.4 适用于分代的复制回收算法73
3.2.5 引用集管理75
3.3 老生代内存管理79
3.3.1 堆空间回收的触发80
3.3.2 堆空间回收算法过程介绍81
3.3.3 适用于分代的标记压缩算法83
3.3.4 标记-压缩的优化86
3.4 扩展阅读:不同的复制算法比较及对程序员的启迪88

第4章 并发标记清除回收92
4.1 内存管理92
4.2 并行的新生代回收95
4.2.1 一般根集合的并行处理96
4.2.2 老生代到新生代引用的并行处理97
4.2.3 卡表的竞争操作介绍99
4.2.4 并行复制算法卡表设计103
4.3 并发回收的难点105
4.3.1 三色标记法105
4.3.2 难点示意图105
4.3.3 读屏障处理107
4.3.4 写屏障之增量标记107
4.3.5 写屏障之SATB标记108
4.4 并发的老生代回收108
4.4.1 内存管理109
4.4.2 标记清除算法概述112
4.4.3 并发算法触发时机113
4.4.4 并发标记清除之初始标记114
4.4.5 并发标记清除之并发标记116
4.4.6 并发标记清除之预清理118
4.4.7 并发标记清除之可终止预清理120
4.4.8 并发标记清除之再标记123
4.4.9 并发标记清除之清除124
4.4.10 并发标记清除之内存空间调整126
4.4.11 并发标记清除之复位127
4.4.12 并发算法难点127
4.5 Full GC131
4.6 扩展阅读:标记栈溢出的各种处理方法131
4.6.1 重新标记法132
4.6.2 全局列表法132
4.6.3 逆指针法133
4.7 扩展阅读:元数据内存管理133
4.7.1 内存管理133
4.7.2 分配135
4.7.3 回收135
4.7.4 元数据管理的优化136

第5章 并行回收138
5.1 内存管理138
5.1.1 内存管理模型140
5.1.2 NUMA支持141
5.1.3 内存分配和GC触发流程143
5.2 Minor GC144
5.3 Full GC145
5.3.1 算法概述145
5.3.2 算法实现与演示148
5.4 扩展阅读:并行任务的负载均衡机制151
5.4.1 并行任务的窃取153
5.4.2 并行任务的终止156

第6章 垃圾优先160
6.1 内存管理概述162
6.1.1 分代下的分区管理163
6.1.2 新生代大小设计164
6.1.3 回收机制的设计166
6.2 引用集设计169
6.2.1 引用集存储169
6.2.2 引用集处理流程172
6.2.3 引用集写入174
6.3 新生代回收和混合回收176
6.3.1 回收过程中引用关系处理178
6.3.2 混合回收导致停顿时间不符合预期的处理方法178
6.3.3 NUMA-Aware支持180
6.3.4 云场景的支持180
6.3.5 并发标记和Minor GC、Mixed GC的交互181
6.4 并发标记183
6.4.1 SATB算法介绍183
6.4.2 增量并发标记算法186
6.5 Full GC188
6.5.1 串行实现算法188
6.5.2 并行实现算法189
6.6 扩展阅读:OpenJ9中的Balanced GC介绍190
6.6.1 内存管理的区别191
6.6.2 大对象设计的区别192
6.6.3 回收的区别193
6.6.4 并发标记的区别194
6.6.5 Full GC与Balanced GC的区别195

第7章 Shenandoah196
7.1 内存模型198
7.1.1 内存分配198
7.1.2 垃圾回收的触发198
7.2 并发标记设计200
7.3 并发转移设计201
7.3.1 引用不变性202
7.3.2 目标空间不变性203
7.3.3 源空间不变性205
7.4 垃圾回收实现206
7.4.1 垃圾回收策略206
7.4.2 垃圾回收模式207
7.4.3 正常回收算法208
7.4.4 优化模式垃圾回收209
7.4.5 垃圾回收的降级209
7.4.6 遍历回收算法210
7.4.7 垃圾回收触发的时机211
7.4.8 其他细节211
7.5 扩展阅读:OpenJ9中的实时垃圾回收器Metronome介绍214

第8章 ZGC219
8.1 内存管理222
8.1.1 内存管理模型222
8.1.2 高速分配设计224
8.2 回收设计226
8.2.1 算法概述227
8.2.2 视图状态229
8.2.3 读屏障232
8.2.4 高效的标记和转移设计234
8.2.5 垃圾回收触发的时机239
8.3 垃圾回收实现243
8.3.1 回收实现243
8.3.2 多线程高效地标记244
8.3.3 多线程高效地转移246
8.3.4 标记和重定位合并的优缺点246
8.4 ZGC新特性概览247
8.4.1 并发类卸载248
8.4.2 并发根扫描249
8.5 扩展阅读:分配预测模型的理论基础251

【第三部分】 JVM中垃圾回收相关参数介绍

第9章 GC通用参数259
9.1 GC生产参数259
9.1.1 GC选择相关参数259
9.1.2 GC工作线程相关参数261
9.1.3 内存设置相关参数263
9.1.4 停顿时间相关参数274
9.1.5 执行效率相关参数275
9.1.6 大页和NUMA参数284
9.1.7 GC日志相关参数285
9.1.8 其他参数285
9.2 GC实验参数288
9.2.1 GC选择相关参数288
9.2.2 引用处理相关参数288
9.2.3 GC任务均衡相关参数288
9.3 GC 诊断参数289
9.3.1 GC工作线程相关参数289
9.3.2 GC校验相关参数290
9.3.3 其他参数291
9.4 可动态调整的参数292
9.5 重要参数小结293

第10章 Parallel GC参数294
10.1 生产参数294
10.1.1 并行压缩相关参数294
10.1.2 并行复制相关参数296
10.2 重要参数小结296

第11章 CMS参数298
11.1 生产参数298
11.1.1 老生代分配相关参数298
11.1.2 老生代合并相关参数300
11.1.3 空闲列表管理相关参数300
11.1.4 老生代预清理相关参数303
11.1.5 老生代再标记相关参数306
11.1.6 Minor GC相关参数307
11.1.7 老生代GC触发控制相关参数308
11.1.8 老生代并行/并发控制相关参数310
11.1.9 其他参数311
11.2 诊断参数313
11.2.1 老生代碎片化相关参数313
11.2.2 Minor GC效率相关参数314
11.2.3 其他参数314
11.3 可动态调整的参数314
11.4 重要参数小结315


第12章 G1参数316
12.1 生产参数316
12.1.1 并发标记相关参数316
12.1.2 引用集处理相关参数318
12.1.3 内存设置相关参数321
12.1.4 Minor GC相关参数321
12.1.5 GC触发控制相关参数322
12.1.6 混合回收相关参数322
12.2 实验参数323
12.2.1 内存设置相关参数323
12.2.2 Minor GC相关参数324
12.2.3 混合回收相关参数325
12.2.4 其他参数325
12.3 可动态调整的参数326
12.4 诊断参数326
12.5 重要参数小结327

第13章 Shenandoah参数328
13.1 生产参数328
13.1.1 垃圾回收模式相关参数328
13.1.2 垃圾回收策略相关参数329
13.2 实验参数329
13.2.1 内存设置相关参数329
13.2.2 垃圾回收策略及相关参数330
13.2.3 并发标记相关参数335
13.3 诊断参数336
13.4 重要参数小结338

第14章 ZGC参数339
14.1 生产参数339
14.2 诊断参数341
14.3 重要参数小结342

【第四部分】 ARM服务器上的GC挑战和优化

第15章 泰山服务器概述345
15.1 ARM架构346
15.1.1 ARM介绍346
15.1.2 ARMv8-A特性348
15.2 鲲鹏处理器353
15.2.1 芯片架构353
15.2.2 内存管理子系统355
15.2.3 流水线技术356
15.2.4 内存一致性357
15.3 泰山服务器358

第16章 AArch64平台上的GC挑战和优化363
16.1 内存序363
16.2 众核架构对性能的影响369
16.3 NUMA对性能的影响370
16.4 其他影响370