G1作為JVM中*新、*成熟的垃圾回收器,已經(jīng)廣泛應用在眾多公司的生產(chǎn)環(huán)境中。本書詳細介紹G1涉及的基本概念和運行原理,以及調(diào)優(yōu)方法。主要內(nèi)容共12章,主要內(nèi)容有:第1~2章介紹垃圾回收的歷史和應用的算法,以及基本概念。第3~7章從多方面分析G1的運行原理,如G1是如何分配對象的,G1的Refine線程、新生代回收、混合回收、FullGC等。第8章介紹垃圾回收過程中如何處理引用,第9章介紹G1引入的新特性:字符串去重,第10章介紹G1垃圾回收過程中線程如何達到安全點,第11章介紹如何選擇垃圾回收器,第12章介紹了下一代垃圾回收器Shenandoah和ZGC。另外,為了降低學習難度,還給出了三個附錄:附錄A介紹如何開始閱讀和調(diào)試JVM代碼,附錄B介紹如何使用NMT對JVM內(nèi)存進行跟蹤和調(diào)試,附錄C介紹了Java程序員閱讀JVM需要知道的一些C++知識。
前 言
第1章 垃圾回收概述 1
1.1 Java發(fā)展概述 1
1.2 本書常見術語 4
1.3 回收算法概述 6
1.3.1 分代管理算法 7
1.3.2 復制算法 7
1.3.3 標記清除 8
1.3.4 標記壓縮 9
1.3.5 算法小結 9
1.4 JVM垃圾回收器概述 9
1.4.1 串行回收 9
1.4.2 并行回收 10
1.4.3 并發(fā)標記回收 10
1.4.4 垃圾優(yōu)先回收 10
第2章 G1的基本概念 14
2.1 分區(qū) 14
2.2 G1停頓預測模型 20
2.3 卡表和位圖 22
2.4 對象頭 24
2.5 內(nèi)存分配和管理 27
2.6 線程 30
2.6.1 棧幀 32
2.6.2 句柄 34
2.6.3 JVM本地方法棧中的對象 36
2.6.4 Java本地方法棧中的對象 40
2.7 日志解讀 40
2.8 參數(shù)介紹和調(diào)優(yōu) 41
第3章 G1的對象分配 43
3.1 對象分配概述 43
3.2 快速分配 46
3.3 慢速分配 56
3.3.1 大對象分配 58
3.3.2 最后的分配嘗試 60
3.4 G1垃圾回收的時機 61
3.4.1 分配時發(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涉及的寫屏障 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 并行任務 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 復制 119
5.3.5 Redirty 120
5.3.6 釋放空間 120
5.4 日志解讀 121
5.4.1 YGC日志 121
5.4.2 大對象日志分析 125
5.4.3 對象年齡日志分析 125
5.5 參數(shù)介紹和調(diào)優(yōu) 126
第6章 混合回收 129
6.1 并發(fā)標記算法詳解 130
6.2 并發(fā)標記算法的難點 133
6.2.1 三色標記法 133
6.2.2 難點示意圖 133
6.2.3 再談寫屏障 135
6.3 G1中混合回收的步驟 141
6.4 混合回收中并發(fā)標記處理的線程 145
6.4.1 并發(fā)標記線程啟動的時機 147
6.4.2 根掃描子階段 148
6.4.3 并發(fā)標記子階段 152
6.4.4 再標記子階段 159
6.4.5 清理子階段 160
6.4.6 啟動混合收集 167
6.5 并發(fā)標記算法演示 170
6.5.1 初始標記子階段 171
6.5.2 根掃描子階段 171
6.5.3 并發(fā)標記子階段 171
6.5.4 再標記子階段 172
6.5.5 清理子階段 173
6.6 GC活動圖 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 標記活躍對象 188
7.2.2 計算對象的新地址 190
7.2.3 更新引用對象的地址 190
7.2.4 移動對象完成壓縮 193
7.2.5 后處理 194
7.3 并行FGC 196
7.3.1 并行標記活躍對象 197
7.3.2 計算對象的新地址 198
7.3.3 更新引用對象的地址 200
7.3.4 移動對象完成壓縮 200
7.3.5 后處理 201
7.4 日志解讀 201
7.5 參數(shù)介紹和調(diào)優(yōu) 202
第8章 G1中的引用處理 203
8.1 引用概述 203
8.2 可回收對象發(fā)現(xiàn) 207
8.3 在GC時的處理發(fā)現(xiàn)列表 210
8.4 重新激活可達的引用 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中的實現(xiàn) 223
第10章 線程中的安全點 226
10.1 安全點的基本概念 226
10.2 G1并發(fā)線程進入安全點 227
10.3 解釋線程進入安全點 230
10.4 編譯線程進入安全點 230
10.5 正在執(zhí)行本地代碼的線程進入安全點 233
10.6 安全點小結 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++知識 276