深入理解 Java 虛擬機 : JVM 高級特性與最佳實踐, 2/e

周志明

買這商品的人也買了...

商品描述

<內容簡介>

第1版兩年內印刷近10次,4家網上書店的評論近4?000條,98%以上的評論全部為5星級的好評,是整個Java圖書領域公認的經典著作和超級暢銷書,繁體版在台灣也十分受歡迎。第2版在第1版的基礎上做了很大的改進:根據最新的JDK 1.7對全書內容進行了全面的升級和補充;增加了大量處理各種常見JVM問題的技巧和實踐;增加了若乾與生產環境相結合的實戰案例;對第1版中的錯誤和不足之處的修正;等等。第2版不僅技術更新、內容更豐富,而且實戰性更強。
《本書共分為五大部分,圍繞內存管理、執行子系統、程序編譯與優化、高效並發等核心主題對JVM進行了全面而深入的分析,深刻揭示了JVM的工作原理。
一部分從宏觀的角度介紹了整個Java技術體系、Java和JVM的發展歷程、模塊化,以及JDK的編譯,這對理解書中後面內容有重要幫助。
二部分講解了JVM的自動內存管理,包括虛擬機內存區域的劃分原理以及各種內存溢出異常產生的原因;常見的垃圾收集算法以及垃圾收集器的特點和工作原理;常見虛擬機監控與故障處理工具的原理和使用方法。
三部分分析了虛擬機的執行子系統,包括類文件結構、虛擬機類加載機制、虛擬機字節碼執行引擎。
四部分講解了程序的編譯與代碼的優化,闡述了泛型、自動裝箱拆箱、條件編譯等語法糖的原理;講解了虛擬機的熱點探測方法、HotSpot的即時編譯器、編譯觸發條件,以及如何從虛擬機外部觀察和分析JIT編譯的數據和結果;
五部分探討了Java實現高效並發的原理,包括JVM內存模型的結構和操作;原子性、可見性和有序性在Java內存模型中的體現;先行發生原則的規則和使用;線程在Java語言中的實現原理;虛擬機實現高效並發所做的一系列鎖優化措施。

<目錄>
前言
第一部分走近Java
第1章走近Java2
1.1概述2
1.2Java技術體系3
1.3Java發展史5
1.4Java虛擬機發展史9
1.4.1SunClassicExactVM9
1.4.2SunHotSpotVM11
1.4.3SunMobile—EmbeddedVMMeta—CircularVM12
1.4.4BEAJRockitIBMJ9VM13
1.4. 5AzulVMBEALiquidVM14
1.4.6ApacheHarmonyGoogleAndroidDalvikVM14
1.4.7MicrosoftJVM及其他15
1.5展望Java技術的未來16
1.5.1模塊化17
1.5.2混合語言17
1.5.3多核並行19
1.5.4進一步豐富語法20
1.5.564位虛擬機21
1.6實戰:自己編譯JDK22
1.6.1獲取JDK源碼22
1.6.2系統需求24
1.6.3構建編譯環境25
1.6.4進行編譯26
1.6.5在IDE工具中進行源碼調試31
1.7本章小結35
第二部分自動內存管理機制
第2章Java內存區域與內存溢出異常38
2.1概述38
2.2運行時數據區域38
2.2.1程序計數器39
2.2.2Java虛擬機棧39
2.2.3本地方法棧40
2.2.4Java堆41
2.2. 5方法區41
2.2.6運行時常量池42
2.2.7直接內存43
2.3HotSpot虛擬機對象探秘43
2.3.1對象的創建44
2.3.2對象的內存佈局47
2.3.3對象的訪問定位48
2.4實戰:OutOfMemoryError異常50
2.4.1Java堆溢出51
2.4.2虛擬機棧和本地方法棧溢出53
2.4.3方法區和運行時常量池溢出56
2.4.4本機直接內存溢出59
2.5本章小結60
第3章垃圾收集器與內存分配策略61
3.1概述61
3.2對像已死嗎62
3.2.1引用計數算法62
3.2.2可達性分析算法64
3.2.3再談引用65
3.2.4生存還是死亡66
3.2.5回收方法區68
3.3垃圾收集算法69
3.3.1標記—清除算法69
3.3.2複製算法70
3.3.3標記—整理算法71
3.3.4分代收集算法72
3.4HotSpot的算法實現72
3.4.1枚舉根節點72
3.4.2安全點73
3.4.3安全區域74
3.5垃圾收集器75
3.5.1Serial收集器76
3.5.2ParNew收集器77
3.5.3ParallelScavenge收集器79
3.5.4SerialOld收集器80
3.5.5ParallelOld收集器80
3.5.6CMS收集器81
3.5.7G1收集器84
3.5.8理解GC日誌89
3.5.9垃圾收集器參數總結90
3.6內存分配與回收策略91
3.6.1對象優先在Eden分配91
3.6.2大對象直接進入老年代93
3.6.3長期存活的對象將進入老年代95
3.6.4動態對象年齡判定97
3.6.5空間分配擔保98
3.7本章小結100
第4章虛擬機性能監控與故障處理工具101
4.1概述101
4.2JDK的命令行工具101
4.2.1jps:虛擬機進程狀況工具104
4.2.2jstat:虛擬機統計信息監視工具105
4.2.3jinfo:Java配置信息工具106
4.2.4jmap:Java內存映像工具107
4.2.5jhat:虛擬機堆轉儲快照分析工具108
4.2.6jstack:Java堆棧跟蹤工具109
4.2.7HSDIS:JIT生成代碼反彙編111
4.3JDK的可視化工具114
4.3.1JConsole:Java監視與管理控制台115
4.3.2VisualVM:多合一故障處理工具122
4.4本章小結131
第5章調優案例分析與實戰132
5.1概述132
5.2案例分析132
5.2.1高性能硬件上的程序部署策略132
5.2.2集群間同步導致的內存溢出135
5.2.3堆外內存導致的溢出錯誤136
5.2.4外部命令導致系統緩慢137
5.2.5服務 ​​器JVM進程崩潰138
5.2.6不恰當數據結構導致內存佔用過大139
5.2.7由Windows虛擬內存導致的長時間停頓141
5.3實戰:Eclipse運行速度調優142
5.3.1調優前的程序運行狀態142
5.3.2升級JDK1.6的性能變化及兼容問題145
5.3.3編譯時間和類加載時間的優化150
5.3.4調整內存設置控制垃圾收集頻率153
5.3.5選擇收集器降低延遲157
5.4本章小結160
第三部分虛擬機執行子系統
第6章類文件結構162
6.1概述162
6.2無關性的基石162
6.3Class類文件的結構164
6.3.1魔數與Class文件的版本166
6.3.2常量池167
6.3.3訪問標誌173
6.3.4類索引、父類索引與接口索引集合174
6.3.5字段表集合175
6.3 .6方法表集合178
6.3.7屬性表集合180
6.4字節碼指令簡介196
6.4.1字節碼與數據類型197
6.4.2加載和存儲指令199
6.4.3運算指令200
6.4.4類型轉換指令202
6.4.5對象創建與訪問指令203
6.4.6操作數棧管理指令203
6.4.7控制轉移指令204
6.4.8方法調用和返回指令204
6.4.9異常處理指令205
6.4.10同步指令205
6.5公有設計和私有實現206
6.6Class文件結構的發展207
6.7本章小結208
第7章虛擬機類加載機制209
7.1概述209
7.2類加載的時機210
7.3類加載的過程214
7.3.1加載214
7.3.2驗證216
7.3.3準備219
7.3.4解析220
7.3.5初始化225
7.4類加載器227
7.4.1類與類加載器228
7.4.2雙親委派模型229
7.4.3破壞雙親委派模型233
7.5本章小結235
第8章虛擬機字節碼執行引擎236
8.1概述236
8.2運行時棧幀結構236
8.2.1局部變量表238
8.2.2操作數棧242
8.2.3動態連接243
8.2.4方法返回地址243
8.2.5附加信息244
8.3方法調用244
8.3.1解析244
8.3.2分派246
8.3.3動態類型語言支持258
8.4基於棧的字節碼解釋執行引擎269
8.4.1解釋執行269
8.4.2基於棧的指令集與基於寄存器的指令集270
8.4.3基於棧的解釋器執行過程272
8.5本章小結275
第9章類加載及執行子系統的案例與實戰276
9.1概述276
9.2案例分析276
9.2.1Tomcat:正統的類加載器架構276
9.2.2OSGi:靈活的類加載器架構279
9.2.3字節碼生成技術與動態代理的實現282
9.2.4Retrotranslator:跨越JDK版本286
9.3實戰:自己動手實現遠程執行功能289
9.3.1目標290
9.3.2思路290
9.3.3實現291
9.3.4驗證298
9.4本章小結299
第四部分程序編譯與代碼優 ​​化
第10章早期(編譯期)優化302
10.1概述302
10.2Javac編譯器303
10.2.1Javac的源碼與調試303
10.2.2解析與填充符號表305
10.2.3註解處理器307
10.2.4語義分析與字節碼生成307
10.3Java語法糖的味道311
10.3.1泛型與類型擦除311
10.3. 2自動裝箱、拆箱與遍歷循環315
10.3.3條件編譯317
10.4實戰:插入式註解處理器318
10.4.1實戰目標318
10.4.2代碼實現319
10.4.3運行與測試326
10.4.4其他應用案例327
10.5本章小結328
第11章晚期(運行期)優化329
11.1概述329
11.2HotSpot虛擬機內的即時編譯器329
11.2.1解釋器與編譯器330
11.2.2編譯對象與觸發條件332
11.2.3編譯過程337
11.2.4查看及分析即時編譯結果339
11.3編譯優化技術345
11.3.1優化技術概覽346
11.3.2公共子表達式消除350
11.3.3數組邊界檢查消除351
11.3.4方法內聯352
11.3 .5逃逸分析354
11.4Java與C/C++的編譯器對比356
11.5本章小結358
第五部分高效並發
第12章Java內存模型與線程360
12.1概述360
12.2硬件的效率與一致性361
12.3Java內存模型362
12.3.1主內存與工作內存363
12.3.2內存間交互操作364
12.3.3對於volatile型變量的特殊規則366
12.3.4對於long和double型變量的特殊規則372
12.3.5原子性、可見性與有序性373
12.3.6先行發生原則375
12.4Java與線程378
12.4.1線程的實現378
12.4.2Java線程調度381
12.4.3狀態轉換383
12.5本章小結384
第13章線程安全與鎖優化385
13.1概述385
13.2線程安全385
13.2.1Java語言中的線程安全386
13.2.2線程安全的實現方法390
13.3鎖優化397
13.3.1自旋鎖與自適應自旋398
13.3.2鎖消除398
13.3.3鎖粗化400
13.3.4輕量級鎖400
13.3.5偏向鎖402
13.4本章小結403
附錄
附錄A編譯Windows版的OpenJDK406
附錄B虛擬機字節碼指令表414
附錄CHotSpot虛擬機主要參數表420
附錄D對象查詢語言(OQL)簡介424
附錄EJDK歷史版本軌跡430