作 者:(英)本傑明·J.埃文斯,(英)詹姆斯·高夫,(英)克裡斯·紐蘭 著 曾波 譯
定 價:109
出 版 社:人民郵電出版社
出版日期:2021年01月01日
頁 數:340
裝 幀:平裝
ISBN:9787115552334
在當前的互聯網開發模式下,繫統訪問量日增、代碼臃腫,各種性能問題紛湧而至。性能優化作為一個常談常新的話題,受到越來越多開發者的關注。而Java是一門使用廣泛的語言,社區生態中積攢了大量寶貴的性能優化經驗。1.作為一本性能調優方面的實用指南,本書從實驗科學的角度將JVM調優的技術原理與方法論相結合,並在此基礎上提供了可選擇的工具。2.通過對各方面的深入研究,本書能讓使用復雜技術棧的中高級Java技術專家以量化和可驗證的方法優化Java應用程序性能。了解Java的原則和技術如何充分利用現代等
●中文版推薦序一xv
中文版推薦序二xvi
序xvii
前言xix
第1章明確優化與性能1
1.1關於Java性能的誤解1
1.2Java性能概覽2
1.3作為實驗科學的性能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各種性能觀測之間的關聯6
1.5閱讀性能圖7
1.6小結11
第2章JVM概覽12
2.1解釋和類加載12
2.2執行字節碼13
2.3HotSpot簡介17
2.4JVM內存管理19
2.5線程和Java內存模型20
2.6認識不同的JVM20
2.7JVM的監控和工具22
2.8小結25
第3章硬件與操作繫統26
3.1現代硬件簡介27
3.2內存27
3.3現代處理器特性33
3.3.1翻譯後備緩衝器33
3.3.2分支預測和推測執行33
3.3.3硬件存儲器模型33
3.4操作繫統34
3.4.1調度器35
3.4.2時間問題36
3.4.3上下文切換37
3.5一個簡單的繫統模型38
3.6基本探測策略39
3.6.1利用CPU40
3.6.2垃圾收集41
3.6.3I/O42
3.6.4機械共鳴43
3.7虛擬化44
3.8JVM和操作繫統45
3.9小結46
第4章性能測試模式與反模式47
4.1性能測試的類型47
4.1.1延遲測試48
4.1.2吞吐量測試48
4.1.3負載測試49
4.1.4壓力測試49
4.1.5耐久性測試49
4.1.6容量規劃測試49
4.1.7退化測試50
4.2很好實踐入門50
4.2.1自上而下的性能測試50
4.2.2創建一個測試環境51
4.2.3確定性能要求52
4.2.4Java特有的問題52
4.2.5將性能測試當作軟件開發生命周期的一部分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被熱門技術分心55
4.4.2被簡單分心55
4.4.3性能調優天纔56
4.4.4按照坊間傳說調優57
4.4.5把責任歸咎給驢58
4.4.6忽略大局59
4.4.7用戶驗收測試環境就是我的計算機60
4.4.8類似生產環境的數據很難表示61
4.5認知偏差與性能測試62
4.5.1還原論思維62
4.5.2確認偏差63
4.5.3戰爭的迷霧(行動偏差)63
4.5.4風險偏差64
4.5.5埃爾斯伯格悖論64
4.6小結65
第5章微基準測試與統計66
5.1Java性能測量66
5.2JMH70
5.2.1不是萬不得已,不要做微基準測試(一個真實的故事)70
5.2.2關於何時使用微基準測試的啟發70
5.2.3JMH框架72
5.2.4執行基準測試73
5.3JVM性能統計77
5.3.1誤差類型78
5.3.2非正態統計82
5.4統計的解釋85
5.5小結88
第6章理解垃圾收集89
6.1標記和清除90
6.2HotSpot運行時92
6.2.1對像的運行時表示92
6.2.2GC根和Arena95
6.3分配與生命周期96
6.4HotSpot中的垃圾收集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小結108
第7章垃圾收集高級話題109
7.1權衡與可插撥的收集器109
7.2並發垃圾收集理論111
7.2.1JVM安全點111
7.2.2三色標記112
7.3CMS114
7.3.1CMS是如何工作的115
7.3.2用於CMS的基本JVM標志117
7.4G1118
7.4.1G1堆布局和區域118
7.4.2G1算法設計119
7.4.3G1的各階段120
7.4.4用於G1的基本JVM標志121
7.5Shenandoah121
7.5.1並發壓縮123
7.5.2獲取Shenandoah123
7.6C4(AzulZing)124
7.7IBMJ9中的均衡收集器127
7.7.1J9對像頭128
7.7.2Balanced收集器的大數組129
7.7.3NUMA和Balanced收集器129
7.8遺留的HotSpot收集器130
7.8.1Serial和SerialOld130
7.8.2增量式CMS131
7.8.3已被廢棄和刪除的垃圾收集組合131
7.8.4Epsilon131
7.9小結132
第8章垃圾收集日志、監控、調優及工具133
8.1認識垃圾收集日志133
8.1.1開啟垃圾收集日志記錄133
8.1.2垃圾收集日志與JMX的對比134
8.1.3JMX的缺點135
8.1.4垃圾收集日志數據帶來的好處136
8.2日志解析工具136
8.2.1Censum137
8.2.2GCViewer139
8.2.3對於同一數據的不同可視化效果140
8.3基本垃圾收集調優141
8.3.1理解分配行為142
8.3.2理解暫停時間144
8.3.3收集器線程和GC根145
8.4調優ParallelGC147
8.5調優CMS148
8.6調優G1150
8.7jHiccup152
8.8小結154
第9章JVM上的代碼執行155
9.1字節碼解釋概覽155
9.1.1JVM字節碼158
9.1.2簡單解釋器163
9.1.3HotSpot特定細節165
9.2AOT編譯和JIT編譯166
9.2.1AOT編譯166
9.2.2JIT編譯167
9.2.3比較AOT和JIT168
9.3HotSpotJIT基礎168
9.3.1Klass字、虛函數表和指針變換168
9.3.2JIT編譯日志169
9.3.3HotSpot中的編譯器171
9.3.4HotSpot中的分層編譯171
9.4代碼緩存172
9.5簡單JIT調優173
9.6小結174
第10章理解即時編譯175
10.1認識JITWatch175
10.1.1基本的JITWatch視圖176
10.1.2調試JVM和hsdi180
10.2介紹JIT編譯180
10.3內聯181
10.3.1內聯的182
10.3.2調優內聯子繫統183
10.4循環展開184
10.5逃逸分析186
10.5.1消除堆分配187
10.5.2鎖與逃逸分析188
10.5.3逃逸分析的189
10.6單態分派192
10.7內部函數195
10.8棧上替換197
10.9再談安全點199
10.10核心庫方法199
10.10.1內聯方法的大小上限199
10.10.2編譯方法的大小上限203
10.11小結204
第11章Java語言性能技術205
11.1優化集合206
11.2針對列表的優化考慮207
11.2.1ArrayList207
11.2.2LinkedList208
11.2.3ArrayList與LinkedList的對比209
11.3針對映射的優化考慮210
11.3.1HashMap210
11.3.2TreeMap212
11.3.3缺少 ltiMap213
11.4針對集的優化考慮213
11.5領域對像213
11.6避免終結化216
11.6.1血淚史:忘記清理217
11.6.2為什麼不使用終結化來解決這個問題217
11.6.3try-with-resources219
11.7方法句柄223
11.8小結226
第12章並發性能技術227
12.1並行介紹228
12.2理解JMM232
12.3構建並發庫236
12.3.1Unsafe237
12.3.2原子與CAS238
12.3.3鎖和自旋鎖239
12.4並發庫總結240
12.4.1java.util.concurrent中的Lock240
12.4.2讀/寫鎖241
12.4.3信號量242
12.4.4並發集合242
12.4.5鎖存器和屏障243
12.5執行器和任務抽像245
12.5.1認識異步執行245
12.5.2選擇一個ExecutorService246
12.5.3Fork/Join246
12.6現代Java並發248
12.6.1流和並行流248
12.6.2無鎖技術249
12.6.3基於Actor的技術250
12.7小結251
第13章剖析252
13.1認識剖析252
13.2采樣與安全點偏差253
13.3面向開發人員的執行剖析工具255
13.3.1VisualVM剖析器255
13.3.2JProfiler256
13.3.3YourKit261
13.3.4JavaFlightRecorder和JavaMissionControl262
13.3.5運維工具266
13.4現代剖析器269
13.5分配剖析器272
13.6堆轉儲分析278
13.7小結280
第14章高性能日志和消息繫統281
14.1日志282
14.2設計一個影響較低的日志記錄器284
14.3使用RealLogic庫實現低延遲286
14.3.1Agrona287
14.3.2SimpleBinaryEncoding291
14.3.3Aeron294
14.3.4Aeron的設計296
14.4小結299
第15章Java9以及Java的未來方向300
15.1Java9中小的性能增強301
15.1.1分段式代碼緩存301
15.1.2緊湊的字符串301
15.1.3新的字符串連接302
15.1.4C2編譯器的改進303
15.1.5新版G1收集器304
15.2Java10和未來版本305
15.2.1新的發布流程305
15.2.2Java10305
15.3Java9及更高版本中的Unsafe307
15.4Valhalla項目和值類型308
15.5Graal和Truffle312
15.6字節碼的未來方向313
15.7並發的未來方向315
15.8總結316
作者介紹318
封面介紹318
本書從實驗科學的角度探討了Java性能優化的方方面面,重點闡述了近期新的實用JVM性能調優策略、工具和技巧。通過本書,我們不僅可以了解Java原理和技術如何充分利用現代硬件和操作繫統、衡量Java性能的陷阱以及微基準測試的弊端有哪些,還能深入研究可能使團隊煩惱的幾種性能測試和常見反模式、JVM垃圾收集、JIT編譯和Java語言性能技術等。本書為讀者打開了深入理解Java性能的大門,並以路標助力其優化之旅。
(英)本傑明·J.埃文斯,(英)詹姆斯·高夫,(英)克裡斯·紐蘭 著 曾波 譯
本傑明·J.埃文斯(Benjamin J.Evans),初創公司jClarity聯合創始人和技術Fellow,獲得過Java Champion榮譽和JavaOne Rockstar獎,《Java程序員修煉之道》合著者。詹姆斯·高夫(James Gough),Java開發者和技術圖書作者,任職於摩根士丹利,專注構建面向客戶的技術。克裡斯·紐蘭(Chris Newland),JITWatch項目作者,Java Champion榮譽得主,ADVFN高級開發者和團隊負責人,擅長使用Java來處理實時的股市數據。【譯者介紹】曾波,互聯網架構師,擁有13年互聯網從業經驗,曾任職於微軟、什麼等