Java性能優(yōu)化實踐 JVM調(diào)優(yōu)策略 工具與技巧
定 價:109 元
叢書名:圖靈程序設(shè)計叢書
- 作者:[英] 本杰明·J.,埃文斯(Benjamin,J.,Evans),[英] 詹姆斯·高夫(James Gough) 著,曾波 譯
- 出版時間:2020/11/1
- ISBN:9787115552334
- 出 版 社:人民郵電出版社
- 中圖法分類:TP312.8
- 頁碼:318
- 紙張:膠版紙
- 版次:1
- 開本:16開
本書從實驗科學(xué)的角度探討了Java性能優(yōu)化的方方面面,重點闡述了**的實用JVM性能調(diào)優(yōu)策略、工具和技巧。通過本書,我們不僅可以了解Java原理和技術(shù)如何充分利用現(xiàn)代硬件和操作系統(tǒng)、衡量Java性能的陷阱以及微基準(zhǔn)測試的弊端有哪些,還能深入研究可能使團(tuán)隊煩惱的幾種性能測試和常見反模式、JVM垃圾收集、JIT編譯和Java語言性能技術(shù)等。本書為讀者打開了深入理解Java性能的大門,并以路標(biāo)助力其優(yōu)化之旅。
適讀人群 :本書適合Java開發(fā)人員閱讀。
在當(dāng)前的互聯(lián)網(wǎng)開發(fā)模式下,系統(tǒng)訪問量日增、代碼臃腫,各種性能問題紛涌而至。性能優(yōu)化作為一個常談常新的話題,受到越來越多開發(fā)者的關(guān)注。而Java是一門使用廣泛的語言,社區(qū)生態(tài)中積攢了大量寶貴的性能優(yōu)化經(jīng)驗。
1.作為一本性能調(diào)優(yōu)方面的實用指南,本書從實驗科學(xué)的角度將JVM調(diào)優(yōu)的技術(shù)原理與方法論相結(jié)合,并在此基礎(chǔ)上提供了可選擇的工具。
2.通過對各方面的深入研究,本書能讓使用復(fù)雜技術(shù)棧的中高級Java技術(shù)專家以量化和可驗證的方法優(yōu)化Java應(yīng)用程序性能。
了解Java的原則和技術(shù)如何充分利用現(xiàn)代硬件和操作系統(tǒng)
探究一些性能測試以及困擾團(tuán)隊的常見反模式
理解測量Java性能數(shù)據(jù)的陷阱以及微基準(zhǔn)測試的缺點
深入研究JVM垃圾收集日志、監(jiān)控、調(diào)優(yōu)和工具
探究JIT編譯和Java語言性能技術(shù)
學(xué)習(xí)Java集合類API與性能有關(guān)的方面,從整體上理解Java并發(fā)
本杰明·J.埃文斯(Benjamin J.Evans),初創(chuàng)公司jClarity聯(lián)合創(chuàng)始人和技術(shù)Fellow,獲得過Java Champion榮譽和JavaOne Rockstar獎,《Java程序員修煉之道》合著者。
詹姆斯·高夫(James Gough),Java開發(fā)者和技術(shù)圖書作者,任職于摩根士丹利,專注構(gòu)建面向客戶的技術(shù)。
克里斯·紐蘭(Chris Newland),JITWatch項目作者,Java Champion榮譽得主,ADVFN高級開發(fā)者和團(tuán)隊負(fù)責(zé)人,擅長使用Java來處理實時的股市數(shù)據(jù)。
【譯者介紹】
曾波,互聯(lián)網(wǎng)架構(gòu)師,擁有13年互聯(lián)網(wǎng)從業(yè)經(jīng)驗,曾任職于微軟、什么值得買、京東金融、鵬博士電信傳媒集團(tuán),曾參與多家公司的技術(shù)團(tuán)隊從建立到成熟的過程,主持實施了重大技術(shù)決策和技術(shù)落地,在大規(guī)模復(fù)雜系統(tǒng)架構(gòu)和技術(shù)管理方面擁有豐富的實踐經(jīng)驗。
中文版推薦序一 xv
中文版推薦序二 xvi
序 xvii
前言 xix
第 1 章 明確優(yōu)化與性能 1
1.1 關(guān)于Java性能的誤解 1
1.2 Java性能概覽 2
1.3 作為實驗科學(xué)的性能 3
1.4 性能分類方法 4
1.4.1 吞吐量 4
1.4.2 延遲 5
1.4.3 容量 5
1.4.4 利用率 5
1.4.5 效率 5
1.4.6 可擴展性 5
1.4.7 降級 6
1.4.8 各種性能觀測之間的關(guān)聯(lián) 6
1.5 閱讀性能圖 7
1.6 小結(jié) 11
第 2 章 JVM概覽 12
2.1 解釋和類加載 12
2.2 執(zhí)行字節(jié)碼 13
2.3 HotSpot簡介 17
2.4 JVM內(nèi)存管理 19
2.5 線程和Java內(nèi)存模型 20
2.6 認(rèn)識不同的JVM 20
2.7 JVM的監(jiān)控和工具 22
2.8 小結(jié) 25
第 3 章 硬件與操作系統(tǒng) 26
3.1 現(xiàn)代硬件簡介 27
3.2 內(nèi)存 27
3.3 現(xiàn)代處理器特性 33
3.3.1 翻譯后備緩沖器 33
3.3.2 分支預(yù)測和推測執(zhí)行 33
3.3.3 硬件存儲器模型 33
3.4 操作系統(tǒng) 34
3.4.1 調(diào)度器 35
3.4.2 時間問題 36
3.4.3 上下文切換 37
3.5 一個簡單的系統(tǒng)模型 38
3.6 基本探測策略 39
3.6.1 利用CPU 40
3.6.2 垃圾收集 41
3.6.3 I/O 42
3.6.4 機械共鳴 43
3.7 虛擬化 44
3.8 JVM和操作系統(tǒng) 45
3.9 小結(jié) 46
第 4 章 性能測試模式與反模式 47
4.1 性能測試的類型 47
4.1.1 延遲測試 48
4.1.2 吞吐量測試 48
4.1.3 負(fù)載測試 49
4.1.4 壓力測試 49
4.1.5 耐久性測試 49
4.1.6 容量規(guī)劃測試 49
4.1.7 退化測試 50
4.2 最佳實踐入門 50
4.2.1 自上而下的性能測試 50
4.2.2 創(chuàng)建一個測試環(huán)境 51
4.2.3 確定性能要求 52
4.2.4 Java特有的問題 52
4.2.5 將性能測試當(dāng)作軟件開發(fā)生命周期的一部分 52
4.3 性能反模式 53
4.3.1 厭倦 53
4.3.2 填充簡歷 54
4.3.3 同儕壓力 54
4.3.4 缺乏理解 54
4.3.5 被錯誤理解的問題/不存在的問題 54
4.4 性能反模式目錄 55
4.4.1 被熱門技術(shù)分心 55
4.4.2 被簡單分心 55
4.4.3 性能調(diào)優(yōu)天才 56
4.4.4 按照坊間傳說調(diào)優(yōu) 57
4.4.5 把責(zé)任歸咎給驢 58
4.4.6 忽略大局 59
4.4.7 用戶驗收測試環(huán)境就是我的計算機 60
4.4.8 類似生產(chǎn)環(huán)境的數(shù)據(jù)很難表示 61
4.5 認(rèn)知偏差與性能測試 62
4.5.1 還原論思維 62
4.5.2 確認(rèn)偏差 63
4.5.3 戰(zhàn)爭的迷霧(行動偏差) 63
4.5.4 風(fēng)險偏差 64
4.5.5 埃爾斯伯格悖論 64
4.6 小結(jié) 65
第 5 章 微基準(zhǔn)測試與統(tǒng)計 66
5.1 Java性能測量 66
5.2 JMH 70
5.2.1 不是萬不得已,不要做微基準(zhǔn)測試(一個真實的故事) 70
5.2.2 關(guān)于何時使用微基準(zhǔn)測試的啟發(fā) 70
5.2.3 JMH框架 72
5.2.4 執(zhí)行基準(zhǔn)測試 73
5.3 JVM性能統(tǒng)計 77
5.3.1 誤差類型 78
5.3.2 非正態(tài)統(tǒng)計 82
5.4 統(tǒng)計的解釋 85
5.5 小結(jié) 88
第 6 章 理解垃圾收集 89
6.1 標(biāo)記和清除 90
6.2 HotSpot運行時 92
6.2.1 對象的運行時表示 92
6.2.2 GC根和Arena 95
6.3 分配與生命周期 96
6.4 HotSpot中的垃圾收集 98
6.4.1 線程本地分配 98
6.4.2 半空間收集 99
6.5 并行收集器 100
6.5.1 新生代并行收集 101
6.5.2 老年代并行收集 102
6.5.3 并行收集器的局限性 103
6.6 分配的作用 104
6.7 小結(jié) 108
第 7 章 垃圾收集高級話題 109
7.1 權(quán)衡與可插拔的收集器 109
7.2 并發(fā)垃圾收集理論 111
7.2.1 JVM安全點 111
7.2.2 三色標(biāo)記 112
7.3 CMS 114
7.3.1 CMS是如何工作的 115
7.3.2 用于CMS的基本JVM標(biāo)志 117
7.4 G1 118
7.4.1 G1堆布局和區(qū)域 118
7.4.2 G1算法設(shè)計 119
7.4.3 G1的各階段 120
7.4.4 用于G1的基本JVM標(biāo)志 121
7.5 Shenandoah 121
7.5.1 并發(fā)壓縮 123
7.5.2 獲取Shenandoah 123
7.6 C4(Azul Zing) 124
7.7 IBM J9中的均衡收集器 127
7.7.1 J9對象頭 128
7.7.2 Balanced收集器的大數(shù)組 129
7.7.3 NUMA和Balanced收集器 129
7.8 遺留的HotSpot收集器 130
7.8.1 Serial和SerialOld 130
7.8.2 增量式CMS 131
7.8.3 已被廢棄和刪除的垃圾收集組合 131
7.8.4 Epsilon 131
7.9 小結(jié) 132
第 8 章 垃圾收集日志、監(jiān)控、調(diào)優(yōu)及工具 133
8.1 認(rèn)識垃圾收集日志 133
8.1.1 開啟垃圾收集日志記錄 133
8.1.2 垃圾收集日志與JMX的對比 134
8.1.3 JMX的缺點 135
8.1.4 垃圾收集日志數(shù)據(jù)帶來的好處 136
8.2 日志解析工具 136
8.2.1 Censum 137
8.2.2 GCViewer 139
8.2.3 對于同一數(shù)據(jù)的不同可視化效果 140
8.3 基本垃圾收集調(diào)優(yōu) 141
8.3.1 理解分配行為 142
8.3.2 理解暫停時間 144
8.3.3 收集器線程和GC根 145
8.4 調(diào)優(yōu)Parallel GC 147
8.5 調(diào)優(yōu)CMS 148
8.6 調(diào)優(yōu)G1 150
8.7 jHiccup 152
8.8 小結(jié) 154
第 9 章 JVM上的代碼執(zhí)行 155
9.1 字節(jié)碼解釋概覽 155
9.1.1 JVM字節(jié)碼 158
9.1.2 簡單解釋器 163
9.1.3 HotSpot特定細(xì)節(jié) 165
9.2 AOT編譯和JIT編譯 166
9.2.1 AOT編譯 166
9.2.2 JIT編譯 167
9.2.3 比較AOT和JIT 168
9.3 HotSpot JIT基礎(chǔ) 168
9.3.1 Klass字、虛函數(shù)表和指針變換 168
9.3.2 JIT編譯日志 169
9.3.3 HotSpot中的編譯器 171
9.3.4 HotSpot中的分層編譯 171
9.4 代碼緩存 172
9.5 簡單JIT調(diào)優(yōu) 173
9.6 小結(jié) 174
第 10 章 理解即時編譯 175
10.1 認(rèn)識JITWatch 175
10.1.1 基本的JITWatch視圖 176
10.1.2 調(diào)試JVM和hsdi 180
10.2 介紹JIT編譯 180
10.3 內(nèi)聯(lián) 181
10.3.1 內(nèi)聯(lián)的限制 182
10.3.2 調(diào)優(yōu)內(nèi)聯(lián)子系統(tǒng) 183
10.4 循環(huán)展開 184
10.5 逃逸分析 186
10.5.1 消除堆分配 187
10.5.2 鎖與逃逸分析 188
10.5.3 逃逸分析的限制 189
10.6 單態(tài)分派 192
10.7 內(nèi)部函數(shù) 195
10.8 棧上替換 197
10.9 再談安全點 199
10.10 核心庫方法 199
10.10.1 內(nèi)聯(lián)方法的大小上限 199
10.10.2 編譯方法的大小上限 203
10.11 小結(jié) 204
第 11 章 Java語言性能技術(shù) 205
11.1 優(yōu)化集合 206
11.2 針對列表的優(yōu)化考慮 207
11.2.1 ArrayList 207
11.2.2 LinkedList 208
11.2.3 ArrayList與LinkedList的對比 209
11.3 針對映射的優(yōu)化考慮 210
11.3.1 HashMap 210
11.3.2 TreeMap 212
11.3.3 缺少MultiMap 213
11.4 針對集的優(yōu)化考慮 213
11.5 領(lǐng)域?qū)ο蟆?13
11.6 避免終結(jié)化 216
11.6.1 血淚史:忘記清理 217
11.6.2 為什么不使用終結(jié)化來解決這個問題 217
11.6.3 try-with-resources 219
11.7 方法句柄 223
11.8 小結(jié) 226
第 12 章 并發(fā)性能技術(shù) 227
12.1 并行介紹 228
12.2 理解JMM 232
12.3 構(gòu)建并發(fā)庫 236
12.3.1 Unsafe 237
12.3.2 原子與CAS 238
12.3.3 鎖和自旋鎖 239
12.4 并發(fā)庫總結(jié) 240
12.4.1 java.util.concurrent中的Lock 240
12.4.2 讀/ 寫鎖 241
12.4.3 信號量 242
12.4.4 并發(fā)集合 242
12.4.5 鎖存器和屏障 243
12.5 執(zhí)行器和任務(wù)抽象 245
12.5.1 認(rèn)識異步執(zhí)行 245
12.5.2 選擇一個ExecutorService 246
12.5.3 Fork/Join 246
12.6 現(xiàn)代Java并發(fā) 248
12.6.1 流和并行流 248
12.6.2 無鎖技術(shù) 249
12.6.3 基于Actor的技術(shù) 250
12.7 小結(jié) 251
第 13 章 剖析 252
13.1 認(rèn)識剖析 252
13.2 采樣與安全點偏差 253
13.3 面向開發(fā)人員的執(zhí)行剖析工具 255
13.3.1 VisualVM剖析器 255
13.3.2 JProfiler 256
13.3.3 YourKit 261
13.3.4 Java Flight Recorder和Java Mission Control 262
13.3.5 運維工具 266
13.4 現(xiàn)代剖析器 269
13.5 分配剖析器 272
13.6 堆轉(zhuǎn)儲分析 278
13.7 小結(jié) 280
第 14 章 高性能日志和消息系統(tǒng) 281
14.1 日志 282
14.2 設(shè)計一個影響較低的日志記錄器 284
14.3 使用Real Logic庫實現(xiàn)低延遲 286
14.3.1 Agrona 287
14.3.2 Simple Binary Encoding 291
14.3.3 Aeron 294
14.3.4 Aeron的設(shè)計 296
14.4 小結(jié) 299
第 15 章 Java 9以及Java的未來方向 300
15.1 Java 9中小的性能增強 301
15.1.1 分段式代碼緩存 301
15.1.2 緊湊的字符串 301
15.1.3 新的字符串連接 302
15.1.4 C2編譯器的改進(jìn) 303
15.1.5 新版G1收集器 304
15.2 Java 10和未來版本 305
15.2.1 新的發(fā)布流程 305
15.2.2 Java 10 305
15.3 Java 9及更高版本中的Unsafe 307
15.4 Valhalla項目和值類型 308
15.5 Graal和Truffle 312
15.6 字節(jié)碼的未來方向 313
15.7 并發(fā)的未來方向 315
15.8 總結(jié) 316
作者介紹 318
封面介紹 318