G1作為JVM中*新、*成熟的垃圾回收器,已經(jīng)廣泛應(yīng)用在眾多公司的生產(chǎn)環(huán)境中。本書(shū)詳細(xì)介紹G1涉及的基本概念和運(yùn)行原理,以及調(diào)優(yōu)方法。主要內(nèi)容共12章,主要內(nèi)容有:第1~2章介紹垃圾回收的歷史和應(yīng)用的算法,以及基本概念。第3~7章從多方面分析G1的運(yùn)行原理,如G1是如何分配對(duì)象的,G1的Refine線程、新生代回收、混合回收、FullGC等。第8章介紹垃圾回收過(guò)程中如何處理引用,第9章介紹G1引入的新特性:字符串去重,第10章介紹G1垃圾回收過(guò)程中線程如何達(dá)到安全點(diǎn),第11章介紹如何選擇垃圾回收器,第12章介紹了下一代垃圾回收器Shenandoah和ZGC。另外,為了降低學(xué)習(xí)難度,還給出了三個(gè)附錄:附錄A介紹如何開(kāi)始閱讀和調(diào)試JVM代碼,附錄B介紹如何使用NMT對(duì)JVM內(nèi)存進(jìn)行跟蹤和調(diào)試,附錄C介紹了Java程序員閱讀JVM需要知道的一些C++知識(shí)。
前 言
第1章 垃圾回收概述 1
1.1 Java發(fā)展概述 1
1.2 本書(shū)常見(jiàn)術(shù)語(yǔ) 4
1.3 回收算法概述 6
1.3.1 分代管理算法 7
1.3.2 復(fù)制算法 7
1.3.3 標(biāo)記清除 8
1.3.4 標(biāo)記壓縮 9
1.3.5 算法小結(jié) 9
1.4 JVM垃圾回收器概述 9
1.4.1 串行回收 9
1.4.2 并行回收 10
1.4.3 并發(fā)標(biāo)記回收 10
1.4.4 垃圾優(yōu)先回收 10
第2章 G1的基本概念 14
2.1 分區(qū) 14
2.2 G1停頓預(yù)測(cè)模型 20
2.3 卡表和位圖 22
2.4 對(duì)象頭 24
2.5 內(nèi)存分配和管理 27
2.6 線程 30
2.6.1 棧幀 32
2.6.2 句柄 34
2.6.3 JVM本地方法棧中的對(duì)象 36
2.6.4 Java本地方法棧中的對(duì)象 40
2.7 日志解讀 40
2.8 參數(shù)介紹和調(diào)優(yōu) 41
第3章 G1的對(duì)象分配 43
3.1 對(duì)象分配概述 43
3.2 快速分配 46
3.3 慢速分配 56
3.3.1 大對(duì)象分配 58
3.3.2 最后的分配嘗試 60
3.4 G1垃圾回收的時(shí)機(jī) 61
3.4.1 分配時(shí)發(fā)生回收 61
3.4.2 外部調(diào)用的回收 61
3.5 參數(shù)介紹和調(diào)優(yōu) 62
第4章 G1的Ref?ine線程 64
4.1 記憶集 64
4.2 Ref?ine線程的功能及原理 72
4.2.1 抽樣線程 72
4.2.2 管理RSet 74
4.2.3 Mutator處理DCQ 78
4.2.4 Ref?ine線程的工作原理 78
4.3 Ref?inement Zone 85
4.4 RSet涉及的寫(xiě)屏障 86
4.5 日志解讀 87
4.6 參數(shù)介紹和調(diào)優(yōu) 90
第5章 新生代回收 93
5.1 YGC算法概述 93
5.2 YGC代碼分析 96
5.2.1 并行任務(wù) 96
5.2.2 其他處理 115
5.3 YGC算法演示 116
5.3.1 選擇CSet 117
5.3.2 根處理 117
5.3.3 RSet處理 118
5.3.4 復(fù)制 119
5.3.5 Redirty 120
5.3.6 釋放空間 120
5.4 日志解讀 121
5.4.1 YGC日志 121
5.4.2 大對(duì)象日志分析 125
5.4.3 對(duì)象年齡日志分析 125
5.5 參數(shù)介紹和調(diào)優(yōu) 126
第6章 混合回收 129
6.1 并發(fā)標(biāo)記算法詳解 130
6.2 并發(fā)標(biāo)記算法的難點(diǎn) 133
6.2.1 三色標(biāo)記法 133
6.2.2 難點(diǎn)示意圖 133
6.2.3 再談寫(xiě)屏障 135
6.3 G1中混合回收的步驟 141
6.4 混合回收中并發(fā)標(biāo)記處理的線程 145
6.4.1 并發(fā)標(biāo)記線程啟動(dòng)的時(shí)機(jī) 147
6.4.2 根掃描子階段 148
6.4.3 并發(fā)標(biāo)記子階段 152
6.4.4 再標(biāo)記子階段 159
6.4.5 清理子階段 160
6.4.6 啟動(dòng)混合收集 167
6.5 并發(fā)標(biāo)記算法演示 170
6.5.1 初始標(biāo)記子階段 171
6.5.2 根掃描子階段 171
6.5.3 并發(fā)標(biāo)記子階段 171
6.5.4 再標(biāo)記子階段 172
6.5.5 清理子階段 173
6.6 GC活動(dòng)圖 174
6.7 日志解讀 174
6.8 參數(shù)優(yōu)化 178
第7章 Full GC 181
7.1 Evac失敗 181
7.2 串行FGC 187
7.2.1 標(biāo)記活躍對(duì)象 188
7.2.2 計(jì)算對(duì)象的新地址 190
7.2.3 更新引用對(duì)象的地址 190
7.2.4 移動(dòng)對(duì)象完成壓縮 193
7.2.5 后處理 194
7.3 并行FGC 196
7.3.1 并行標(biāo)記活躍對(duì)象 197
7.3.2 計(jì)算對(duì)象的新地址 198
7.3.3 更新引用對(duì)象的地址 200
7.3.4 移動(dòng)對(duì)象完成壓縮 200
7.3.5 后處理 201
7.4 日志解讀 201
7.5 參數(shù)介紹和調(diào)優(yōu) 202
第8章 G1中的引用處理 203
8.1 引用概述 203
8.2 可回收對(duì)象發(fā)現(xiàn) 207
8.3 在GC時(shí)的處理發(fā)現(xiàn)列表 210
8.4 重新激活可達(dá)的引用 214
8.5 日志解讀 215
8.6 參數(shù)介紹和調(diào)優(yōu) 215
第9章 G1的新特性:字符串去重 217
9.1 字符串去重概述 217
9.2 日志解讀 220
9.3 參數(shù)介紹和調(diào)優(yōu) 222
9.4 字符串去重和String.intern的區(qū)別 222
9.5 String.intern中的實(shí)現(xiàn) 223
第10章 線程中的安全點(diǎn) 226
10.1 安全點(diǎn)的基本概念 226
10.2 G1并發(fā)線程進(jìn)入安全點(diǎn) 227
10.3 解釋線程進(jìn)入安全點(diǎn) 230
10.4 編譯線程進(jìn)入安全點(diǎn) 230
10.5 正在執(zhí)行本地代碼的線程進(jìn)入安全點(diǎn) 233
10.6 安全點(diǎn)小結(jié) 236
10.7 日志分析 236
10.8 參數(shù)介紹和調(diào)優(yōu) 238
第11章 垃圾回收器的選擇 241
11.1 如何衡量垃圾回收器 241
11.2 G1調(diào)優(yōu)的方向 243
第12章 新一代垃圾回收器 247
12.1 Shenandoah 247
12.2 ZGC 258
附錄A 編譯調(diào)試JVM 262
附錄B 本地內(nèi)存跟蹤 272
附錄C 閱讀JVM需要了解的C++知識(shí) 276