《Java性能權威指南(第2版)》是2022年人民郵電出版社出版的圖書,作者是[美] 斯科特·奧克斯(Scott Oaks)。
基本介紹
- 中文名:Java性能權威指南(第2版)
- 作者:[美] 斯科特·奧克斯(Scott Oaks)
- 出版時間:2022年4月1日
- 出版社:人民郵電出版社
- ISBN:9787115587367
- 開本:16 開
- 裝幀:平裝
內容簡介,圖書目錄,作者簡介,
內容簡介
本書從JVM和Java API兩個方面,深入地介紹了Java 8和Java 11等新的Java長期支持版本中影響性能的因素。本書先從Java應用程式的通用方法、基準測試的缺陷、性能監控工具等方面,分析了如何通過JVM的配置方式影響程式的性能;接著從即時編譯、垃圾回收、堆記憶體與原生記憶體最佳實踐、執行緒與同步的性能等方面,分析了常見的最佳化方向及其特性。第2版專注於更加成熟的Java 8和Java 11,主要的更新內容涉及G1垃圾回收器和Java飛行記錄器,以及Java在容器化環境下的性能變化。
圖書目錄
前言 xiii
第 1章 導論 1
1.1 概述 2
1.2 平台和約定 2
1.2.1 Java平台 2
1.2.2 硬體平台 4
1.3 全面的性能 6
1.3.1 寫出更好的算法 6
1.3.2 寫更少的代碼 7
1.3.3 過早最佳化 8
1.3.4 其他:資料庫永遠是瓶頸 9
1.3.5 常見最佳化 9
1.4 小結 10
第 2章 性能測試方法 11
2.1 測試真實的應用程式 11
2.1.1 微基準測試 11
2.1.2 宏基準測試 15
2.1.3 介基準測試 16
2.2 理解吞吐量、批處理時間和回響時間 17
2.2.1 測量批處理時間17
2.2.2 測量吞吐量18
2.2.3 測量回響時間 19
2.3 理解可變性22
2.4 早測試、常測試 25
2.5 基準測試示例 27
2.5.1 Java 微基準測試工具 27
2.5.2 常用代碼示例 34
2.6 小結 36
第3 章 Java 性能工具箱 38
3.1 作業系統工具和分析 38
3.1.1 CPU 使用率 39
3.1.2 CPU 運行佇列 41
3.1.3 磁碟使用率 42
3.1.4 網路使用率 44
3.2 Java 監控工具 45
3.2.1 基本的VM 信息 46
3.2.2 執行緒信息 48
3.2.3 類信息 49
3.2.4 實時GC 分析 49
3.2.5 堆轉儲後期處理 49
3.3 性能分析工具 49
3.3.1 採樣分析器 50
3.3.2 探查分析器 53
3.3.3 阻塞方法和執行緒時間線 54
3.3.4 原生分析器 55
3.4 JFR 57
3.4.1 Java Mission Control 57
3.4.2 JFR 概覽 58
3.4.3 開啟JFR 64
3.4.4 選擇JFR 事件 67
3.5 小結 69
第4 章 使用即時編譯器 70
4.1 即時編譯器:概覽 70
4.2 分層編譯 73
4.3 常用的編譯器標誌 74
4.3.1 最佳化代碼快取 74
4.3.2 檢查編譯過程 75
4.3.3 分層編譯級別 78
4.3.4 逆最佳化 79
4.4 高級編譯器標誌 82
4.4.1 編譯閾值 82
4.4.2 編譯執行緒 83
4.4.3 內聯 85
4.4.4 逃逸分析 86
4.4.5 CPU 相關代碼 87
4.5 分層編譯的權衡 88
4.6 GraalVM 89
4.7 預編譯 90
4.7.1 提前編譯 90
4.7.2 GraalVM 原生編譯 92
4.8 小結 93
第5 章 垃圾回收簡介 95
5.1 垃圾回收概覽 95
5.1.1 分代垃圾回收器97
5.1.2 GC 算法99
5.1.3 選擇GC 算法101
5.2 GC 最佳化基礎108
5.2.1 調整堆的大小 108
5.2.2 調整分代大小 110
5.2.3 調整元空間大小 112
5.2.4 控制並行113
5.3 GC 工具114
5.3.1 在JDK 8 中開啟GC 日誌 114
5.3.2 在JDK 11 中開啟GC 日誌 115
5.4 小結 118
第6 章 垃圾回收算法 119
6.1 理解Throughput 回收器 119
6.2 理解G1 垃圾回收器 125
6.3 理解CMS 回收器 136
6.4 高級最佳化 143
6.4.1 晉升和Survivor 空間143
6.4.2 分配大對象 146
6.4.3 AggressiveHeap 標誌 152
6.4.4 完全掌控堆的大小 153
6.5 實驗性GC 算法 154
6.5.1 並發壓縮:ZGC 和Shenandoah 154
6.5.2 無回收:Epsilon GC 156
6.6 小結157
第7 章 堆記憶體最佳實踐 159
7.1 堆分析 159
7.1.1 堆直方圖160
7.1.2 堆轉儲161
7.1.3 記憶體溢出錯誤 164
7.2 減少記憶體使用 168
7.2.1 減小對象大小 169
7.2.2 使用延遲初始化171
7.2.3 使用不可變對象和標準化對象 175
7.3 對象生命周期管理 176
7.3.1 對象重用177
7.3.2 軟引用、弱引用和其他引用181
7.3.3 壓縮的普通對象指針193
7.4 小結194
第8 章 原生記憶體最佳實踐195
8.1 記憶體占用195
8.1.1 測量記憶體占用 196
8.1.2 最小化記憶體占用197
8.1.3 原生記憶體跟蹤 197
8.1.4 共享庫原生記憶體201
8.2 針對作業系統的JVM 最佳化 204
8.3 小結208
第9 章 執行緒和同步性能 209
9.1 執行緒和硬體209
9.2 執行緒池和ThreadPoolExecutor 210
9.2.1 設定最大執行緒數210
9.2.2 設定最小執行緒數213
9.2.3 執行緒池任務大小215
9.2.4 設定ThreadPoolExecutor 的大小215
9.3 ForkJoinPool.217
9.3.1 工作竊取 221
9.3.2 自動並行化 223
9.4 執行緒同步 224
9.4.1 同步的代價 225
9.4.2 避免同步 228
9.4.3 偽共享 230
9.5 JVM 執行緒最佳化 233
9.5.1 最佳化執行緒棧大小 234
9.5.2 偏向鎖234
9.5.3 執行緒優先權 235
9.6 監控執行緒和鎖 235
9.6.1 查看執行緒235
9.6.2 查看阻塞執行緒 236
9.7 小結239
第 10 章 Java 伺服器 240
10.1 Java NIO 概覽 240
10.2 伺服器容器 242
10.2.1 最佳化伺服器執行緒池 242
10.2.2 異步Rest 伺服器 243
10.3 異步出站調用246
10.4 JSON 處理251
10.4.1 解析和編組概覽 252
10.4.2 JSON 對象 253
10.4.3 JSON 解析 254
10.5 小結 256
第 11 章 資料庫性能最佳實踐 257
11.1 示例資料庫 258
11.2 JDBC 258
11.2.1 JDBC 驅動 258
11.2.2 JDBC 連線池 260
11.2.3 預處理語句和語句池 261
11.2.4 事務 262
11.2.5 結果集處理269
11.3 JPA270
11.3.1 最佳化JPA 寫 271
11.3.2 最佳化JPA 讀 272
11.3.3 JPA 快取 275
11.4 Spring Data280
11.5 小結281
第 12 章 Java SE API 技巧282
12.1 字元串 282
12.1.1 壓縮字元串 282
12.1.2 重複字元串和字元串保留283
12.1.3 字元串連線 288
12.2 緩衝I/O 291
12.3 類載入 293
12.4 隨機數 296
12.5 Java 原生接口298
12.6 異常300
12.7 日誌303
12.8 Java 集合API304
12.8.1 同步和非同步305
12.8.2 設定集合大小306
12.8.3 集合與記憶體效率 307
12.9 Lambda 和匿名類 308
12.10 流和過濾器的性能310
12.11 對象序列化 312
12.11.1 瞬時欄位312
12.11.2 覆蓋默認的序列化313
12.11.3 壓縮序列化數據 315
12.11.4 跟蹤重複對象317
12.12 小結 319
附錄 調優標誌總結 321
作者簡介
斯科特.奧克斯(Scott Oaks)
Oracle公司架構師,從事Oracle雲平台軟體的性能最佳化工作。在加入Oracle之前,他是Sun公司的Java布道師,並在2001年加入Java性能工程小組,專注於Java的性能最佳化工作。除了本書,他還著有多部涉及Java執行緒、Java安全等方面的著作。
黨文亮
沉浸Java相關領域多年,目前在華為雲專注於性能診斷平台和OS管理系統的研發,有大量從0到1的項目實踐經驗,在逆向、性能、算法等方面都有一定的積累。