JVM性能調優:深入理解OpenJDK和HotSpot
[美] 莫妮卡·貝克維斯(Monica Beckwith)著 成海霞 譯
- 出版商: 清華大學
- 出版日期: 2026-02-01
- 售價: $588
- 語言: 簡體中文
- ISBN: 7302708282
- ISBN-13: 9787302708285
-
相關分類:
JVM 語言
- 此書翻譯自: JVM Performance Engineering: Inside OpenJDK and the HotSpot Java Virtual Machine (Paperback)
下單後立即進貨 (約4週~6週)
商品描述
"探索Java虛擬機的核心機理與魅力,揭開其神秘面紗 《JVM性能調優:深入理解OpenJDK和HotSpot》是資深Java開發者探索JVM性能核心機理的**寶典。它不僅是一本實用的指南,更是所有渴望揭開JVM神秘面紗、精進技術的Java專業人士的必讀之作。本書聚焦於OpenJDK HotSpot虛擬機,深入剖析了最前沿的Java性能優化技術與行業發展趨勢。 Monica Beckwith,這位傑出的Java冠軍,巧妙地將深邃的理論見解與實用工具相結合,通過豐富的案例研究、應用程序、用例圖和流程圖,全方位展示了JVM的診斷技術、性能提升策略和優化技巧。 這本手冊猶如開啟Java性能工程巔峰之門的金鑰匙,為Java開發者、系統架構師和軟件工程師提供了助力職業發展和在Java應用開發領域取得突破性成就的寶貴資源。 ? 深入探究Java類型系統的演進歷程(從Lambda表達式的引入,到record和密封類的誕生),並進一步探索Valhalla項目如何進一步優化Java性能。 ? 利用JVM統一日誌接口增強診斷、監控和性能測試能力,包括采用創新的異步日誌記錄機制。 ? 掌握JVM與硬件之間的復雜交互,精通端到端的Java性能優化技術。 ? 深度剖析JVM的垃圾收集和內存管理機制,重點研究G1 GC、ZGC等關鍵垃圾收集器的工作原理,以及它們對Java性能未來發展的深遠影響。 ? 探索高效的JVM部署策略與技術,利用類數據共享、AOT編譯,以及GraalVM和Leyden項目等創新技術,加速JVM的啟動和運行。 ? 探討JVM與GPU、FPGA等異構硬件的協同工作機制,挖掘Panama項目和TornadoVM在機器學習、數據分析等高性能計算場景中的潛力。 ? 深入探討虛擬線程技術,並研究字符串處理和並發編程的運行時優化策略,推動Java技術的持續發展。"
作者簡介
Monica Beckwith是備受贊譽的JavaOne明星人物,她為Java HotSpot虛擬機的性能優化做出了不可磨滅的貢獻。她的職業生涯精彩紛呈,曾擔任微軟的首席性能工程師、Arm公司JVM性能架構師,以及Oracle公司G1垃圾收集器性能團隊的領導者。她還是Java Performance Companion一書的合著者。
目錄大綱
目 錄
第1章 Java性能演變史:編程語言與虛擬機 1
1.1 Java生態系統的誕生 2
1.2 JDK的演進歷程 2
1.3 Java HotSpot虛擬機及其編譯策略 3
1.3.1 HotSpot執行引擎的演變 3
1.3.2 解釋器和JIT編譯 5
1.3.3 編譯日誌的打印 5
1.3.4 分層編譯機制 6
1.3.5 客戶端和服務器端編譯器 7
1.3.6 分段代碼緩存 7
1.3.7 自適應優化和反向優化 9
1.4 HotSpot內存管理單元:垃圾收集器 12
1.4.1 分代垃圾收集、STW算法和並發算法 13
1.4.2 新生代收集與弱分代假說 14
1.4.3 老年代收集和觸發機制 15
1.4.4 並行和並發垃圾收集線程及其配置 16
1.5 Java語言及其生態系統的發展 18
1.5.1 Java 1.1至Java 1.4.2(J2SE 1.4.2) 18
1.5.2 Java 5 (J2SE 5.0) 19
1.5.3 Java 6 (Java SE 6) 22
1.5.4 Java 7 (Java SE 7) 24
1.5.5 Java 8 (Java SE 8) 28
1.5.6 Java 9(Java SE 9)至Java 16 (Java SE 16) 30
1.5.7 Java 17 (Java SE 17) 38
1.6 提升性能與擁抱變革 40
第2章 Java類型系統的發展及其性能影響 41
2.1 J2SE 5.0前的原始類型和字面量 42
2.2 J2SE 5.0前的引用類型 43
2.2.1 接口 43
2.2.2 類 45
2.2.3 數組 46
2.3 J2SE 5.0至Java SE 8類型系統的發展 47
2.3.1 枚舉類型 47
2.3.2 註解 48
2.3.3 Java SE 8中其他重要改進 48
2.4 Java 9與Java 10類型系統的發展 50
2.5 Java 11至Java 17類型系統的發展 52
2.5.1 switch表達式 52
2.5.2 密封類 54
2.5.3 記錄類型 55
2.6 Java 17之後:Valhalla項目 55
2.6.1 現有類型系統的性能影響 56
2.6.2 值類對內存管理的影響 61
2.6.3 重定義原始類型泛型支持 61
2.6.4 Valhalla項目 62
2.6.5 早期訪問版本:先進的Valhalla理念 63
2.6.6 用例分析:理論與實際 64
2.6.7 不同語言間的對比 64
2.7 本章小結 65
第3章 從單體到模塊化的演進之路 67
3.1 Java模塊化系統概述 67
3.1.1 模塊化系統介紹 68
3.1.2 模塊化示例 68
3.1.3 編譯和運行細節 70
3.1.4 新模塊引入 70
3.2 從單體到模塊化的JDK演變 75
3.3 JDK 11及更高版本中的模塊化JDK 75
3.4 JDK 17模塊化服務實現 75
3.4.1 服務提供者 76
3.4.2 服務消費者 77
3.4.3 示例 77
3.4.4 實現細節 78
3.5 JAR地獄和Jigsaw Layer 80
3.5.1 解決JAR地獄示例 81
3.5.2 實現細節 82
3.6 OSGi 87
3.6.1 OSGi概覽 87
3.6.2 OSGi與Java模塊層的相似之處 88
3.6.3 OSGi與Java模塊層的差異 88
3.7 jdeps、jlink、jdeprscan和jmod簡介 89
3.7.1 jdeps 89
3.7.2 jdeprscan 90
3.7.3 jmod 91
3.7.4 jlink 92
3.8 本章小結 93
3.8.1 性能影響 93
3.8.2 工具和未來展望 93
3.8.3 擁抱模塊化編程範式 93
第4章 JVM統一日誌接口 95
4.1 統一日誌記錄的必要性 95
4.2 統一日誌與基礎設施 96
4.3 統一日誌系統中的標簽 97
4.3.1 日誌標簽 97
4.3.2 標簽指定 98
4.3.3 識別缺失信息 99
4.4 日誌級別、輸出和裝飾器 99
4.4.1 日誌級別 99
4.4.2 裝飾器 101
4.4.3 日誌輸出 102
4.5 使用統一日誌系統的示例 103
4.5.1 基準測試和性能測試 104
4.5.2 工具和技術 105
4.6 優化和管理統一日誌系統 105
4.7 異步日誌和統一日誌系統 106
4.7.1 異步日誌記錄的優勢 106
4.7.2 Java中異步日誌實現 107
4.7.3 最佳實踐和註意事項 108
4.8 JDK 11與JDK 17的日誌增強功能 109
4.8.1 JDK 11 109
4.8.2 JDK 17 110
4.9 本章小結 110
第5章 端到端性能優化:JMH和微基準測試 111
5.1 本章簡介 111
5.2 軟件工程的核心支柱:性能工程 112
5.2.1 解碼軟件工程的各個層面 112
5.2.2 關鍵質量屬性:性能 112
5.2.3 了解和評估性能 113
5.2.4 定義服務質量 113
5.2.5 衡量性能需求的成功標準 114
5.3 衡量Java應用程序性能的指標 114
5.3.1 占用空間 115
5.3.2 響應時間 118
5.3.3 吞吐量 119
5.3.4 可用性 119
5.3.5 響應時間與可用性 120
5.3.6 應用程序響應時間的時間軸分析 121
5.4 硬件對性能的影響 123
5.4.1 解碼硬件與軟件的動態關系 124
5.4.2 性能交響曲:編程語言、處理器和內存模型 125
5.4.3 性能提升之道:優化系統協作 126
5.4.4 內存模型:解讀線程動態和性能影響 127
5.4.5 硬件上的並發 130
5.4.6 並發計算中的秩序機制:屏障、柵欄和volatile變量 132
5.4.7 深入理解原子性:Java內存模型和先行發生原則 133
5.4.8 多處理器系統中的並發內存訪問和一致性 135
5.4.9 結合我在AMD、Sun Microsystems和ARM的經歷深度挖掘NUMA 135
5.4.10 理論與實踐的橋梁:並發、庫和高級工具 139
5.5 一種靈活且全面的性能工程方法論 139
5.5.1 實驗設計 139
5.5.2 自下而上的方法論 140
5.5.3 自上而下的方法論 142
5.5.4 制定工作說明書 142
5.5.5 一種自上而下的性能優化流程 143
5.5.6 以工作說明書為基礎調查子系統 144
5.5.7 本節要點 150
5.6 性能基準的重要性 151
5.6.1 關鍵性能指標 151
5.6.2 從規劃到分析建立性能基準制度 152
5.6.3 JVM內存管理基準測試綜合指南 154
5.6.4 為何需要基準測試工具 156
5.6.5 Java微基準測試套件在性能優化中的作用 157
5.6.6 使用Maven入門Java微基準測試套件 158
5.6.7 在JMH中編寫、構建和運行第一個微基準 158
5.6.8 基準測試階段:預熱和測量 160
5.6.9 循環優化和@Operations PerInvocation註解 161
5.6.10 JMH的基準模式 161
5.6.11 理解JMH中的分析器 162
5.6.12 JMH中的關鍵註解 162
5.6.13 使用JMH進行JVM基準測試 163
5.6.14 使用perfasm分析JMH基準 165
5.7 本章小結 166
第6章 OpenJDK中的高級內存管理和垃圾收集 167
6.1 本章簡介 167
6.2 Java垃圾收集器概述 168
6.3 TLAB和PLAB 169
6.4 利用NUMA感知型的垃圾收集器優化內存訪問 171
6.5 探索垃圾收集器的改進 173
6.5.1 通過G1垃圾收集器深入了解高級堆管理 174
6.5.2 區域化堆的優勢 176
6.5.3 優化G1垃圾收集器參數實現峰值性能 178
6.5.4 適用於多TB堆內存的可擴展、低延遲的ZGC 186
6.6 垃圾收集器的未來趨勢 198
6.7 評估垃圾收集器性能的實用技巧 200
6.8 評估不同工作負載下垃圾收集器的性能 202
6.8.1 事務工作負載類型 202
6.8.2 本節內容回顧 203
6.9 實時數據集壓力 204
6.9.1 數據生命周期模式 204
6.9.2 對不同垃圾收集算法的影響 205
6.9.3 優化內存管理 205
第7章 運行時性能優化:聚焦字符串、鎖及其他 207
7.1 本章簡介 207
7.2 字符串優化 208
7.2.1 HotSpot虛擬機中的字面量和駐留字符串優化 209
7.2.2 字符串去重優化與G1垃圾收集器 211
7.2.3 減少字符串的內存占用 212
7.3 提升多線程性能:Java線程同步 223
7.3.1 監視器鎖的作用 225
7.3.2 OpenJDK HotSpot虛擬機中的鎖類型 225
7.3.3 代碼示例和分析 226
7.3.4 Java鎖機制的發展 228
7.3.5 自Java 9以來對競爭鎖的優化 230
7.3.6 關於可視化競爭鎖優化的性能工程實踐 232
7.3.7 競爭鎖優化的一些反思 242
7.3.8 一種間接鎖改進:自旋等待提示 243
7.4 從Thread-Per-Task模型轉向更具可擴展性的模型 245
7.4.1 傳統的一對一線程映射 246
7.4.2 通過Thread-Per-Request模型提高可擴展性 246
7.4.3 虛擬線程重塑Java的並發編程 251
7.5 本章小結 256
第8章 使用OpenJDK HotSpot 虛擬機加速進入穩定狀態 257
8.1 本章簡介 257
8.2 優化JVM啟動和預熱的技術 258
8.3 Java應用程序從解碼到穩定狀態的時間 258
8.3.1 準備、就緒、啟動 258
8.3.2 啟動JVM的各個階段 259
8.3.3 達到應用程序的穩定狀態 260
8.3.4 應用程序的生命周期 261
8.4 啟動和加速期間的狀態管理 263
8.4.1 啟動期間的狀態 263
8.4.2 進入加速階段和穩定狀態 263
8.4.3 高效狀態管理的優勢 264
8.4.4 類數據共享 265
8.4.5 AOT編譯 266
8.5 GraalVM徹底改變Java的穩態時間 272
8.6 新興技術:用於檢查點及恢復功能的CRIU和CRaC項目 274
8.7 優化無服務器環境和其他環境中的啟動和加速階段 277
8.7.1 無服務器計算和JVM優化 278
8.7.2 在容器化環境中確保快速啟動和高效擴展 279
8.7.3 GraalVM的當今貢獻 279
8.7.4 本節要點小結 279
8.8 利用OpenJDK HotSpot虛擬機提升預熱性能 281
8.8.1 編譯器的改進 281
8.8.2 分段代碼緩存和Leyden項目的增強功能 284
8.8.3 從永久代到元空間向 峰值性能飛躍 284
8.9 本章小結 287
第9章 使用異構硬件打造JVM性能的未來 289
9.1 異構硬件和JVM簡介 289
9.2 雲計算中的異構硬件 291
9.2.1 硬件異構性 292
9.2.2 API兼容性和Hypervisor限制 292
9.2.3 性能權衡 293
9.2.4 資源競爭 293
9.2.5 雲計算的特定限制 294
9.3 編程語言設計和工具鏈的作用 294
9.4 案例研究 296
9.4.1 LWJGL:一個基礎示例 297
9.4.2 Aparapi:連接Java和OpenCL的橋梁 300
9.4.3 Sumatra項目:一項重大努力 303
9.4.4 TornadoVM:硬件加速器專用JVM 306
9.4.5 Panama項目:新視野 309
9.5 JVM與Panama項目 314
9.5.1 高級JVM語言API和本地庫 315
9.5.2 Vector API和向量化數據處理系統 315
9.5.3 用於數據訪問、緩存和格式化的加速器描述符 315
9.5.4 未來已來 316
9.6 結束語:暢想JVM性能工程 317



