《JVM G1源碼分析和調優》是機械工業出版社出版的圖書,作者是彭成寒
基本介紹
- 作者:彭成寒
- 出版時間:2019年3月
- 出版社:機械工業出版社
- ISBN:9787111621973
- 叢書:Java核心技術系列
內容簡介,圖書目錄,作者簡介,
內容簡介
G1是目前最成熟的垃圾回收器,已經廣泛套用在眾多公司的生產環境中。我們知道,CMS作為使用最為廣泛的垃圾回收器,也有令人頭疼的問題,即如何對其眾多的參數進行正確的設定。G1的目標就是替代CMS,所以在設計之初就希望降低程式設計師的負擔,減少人工的介入。但這並不意味著我們完全不需要了解G1的原理和參數調優。筆者在實際工作中遇到過一些因參數設定不正確而導致GC停頓時間過長的問題。但要正確設定參數並不容易,這裡涉及兩個方面:第一,需要對G1的原理熟悉,只有熟悉G1的原理才知道調優的方向;第二,能分析和解讀G1運行的日誌信息,根據日誌信息找到G1運行過程中的異常信息,並推斷哪些參數可以解決這些異常。本書嘗試從G1的原理出發,系統地介紹新生代回收、混合回收、Full GC、並發標記、Refine執行緒等內容;同時依託於jdk8u的原始碼介紹Hotspot如何實現G1,通過對原始碼的分析來了解G1提供了哪些參數、這些參數的具體意義;最後本書還設計了一些示例代碼,給出了G1在運行這些示例代碼時的日誌,通過日誌分析來嘗試調整參數並達到性能最佳化,還分析了參數調整可能帶來的負面影響。
圖書目錄
前 言
第1章 垃圾回收概述 1
1.1 Java發展概述 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 並發標記回收 10
1.4.4 垃圾優先回收 10
第2章 G1的基本概念 14
2.1 分區 14
2.2 G1停頓預測模型 20
2.3 卡表和點陣圖 22
2.4 對象頭 24
2.5 記憶體分配和管理 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 參數介紹和調優 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 分配時發生回收 61
3.4.2 外部調用的回收 61
3.5 參數介紹和調優 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 參數介紹和調優 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 參數介紹和調優 126
第6章 混合回收 129
6.1 並發標記算法詳解 130
6.2 並發標記算法的難點 133
6.2.1 三色標記法 133
6.2.2 難點示意圖 133
6.2.3 再談寫屏障 135
6.3 G1中混合回收的步驟 141
6.4 混合回收中並發標記處理的執行緒 145
6.4.1 並發標記執行緒啟動的時機 147
6.4.2 根掃描子階段 148
6.4.3 並發標記子階段 152
6.4.4 再標記子階段 159
6.4.5 清理子階段 160
6.4.6 啟動混合收集 167
6.5 並發標記算法演示 170
6.5.1 初始標記子階段 171
6.5.2 根掃描子階段 171
6.5.3 並發標記子階段 171
6.5.4 再標記子階段 172
6.5.5 清理子階段 173
6.6 GC活動圖 174
6.7 日誌解讀 174
6.8 參數最佳化 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 參數介紹和調優 202
第8章 G1中的引用處理 203
8.1 引用概述 203
8.2 可回收對象發現 207
8.3 在GC時的處理髮現列表 210
8.4 重新激活可達的引用 214
8.5 日誌解讀 215
8.6 參數介紹和調優 215
第9章 G1的新特性:字元串去重 217
9.1 字元串去重概述 217
9.2 日誌解讀 220
9.3 參數介紹和調優 222
9.4 字元串去重和String.intern的區別 222
9.5 String.intern中的實現 223
第10章 執行緒中的安全點 226
10.1 安全點的基本概念 226
10.2 G1並發執行緒進入安全點 227
10.3 解釋執行緒進入安全點 230
10.4 編譯執行緒進入安全點 230
10.5 正在執行本地代碼的執行緒進入安全點 233
10.6 安全點小結 236
10.7 日誌分析 236
10.8 參數介紹和調優 238
第11章 垃圾回收器的選擇 241
11.1 如何衡量垃圾回收器 241
11.2 G1調優的方向 243
第12章 新一代垃圾回收器 247
12.1 Shenandoah 247
12.2 ZGC 258
附錄A 編譯調試JVM 262
附錄B 本地記憶體跟蹤 272
附錄C 閱讀JVM需要了解的C++知識 276
作者簡介
彭成寒:高級Java工程師,目前主要從事風控系統設計、算法建模、大數據處理等工作。有超過10年的Java和C++開發經驗。