1. 程式人生 > >《深入理解Java虛擬機器——JVM高階特性與最佳實踐(第2版)》pdf

《深入理解Java虛擬機器——JVM高階特性與最佳實踐(第2版)》pdf

前言 致謝 第一部分 走近Java 第1章 走近Java / 2 1.1 概述 / 2 1.2 Java技術體系 / 3 1.3 Java發展史 / 5 1.4 展望Java技術的未來 / 9 1.4.1 模組化 / 9 1.4.2 混合語言 / 9 1.4.3 多核並行 / 11 1.4.4 進一步豐富語法 / 12 1.4.5 64位虛擬機器 / 13 1.5 實戰:自己編譯JDK / 13 1.5.1 獲取JDK原始碼 / 13 1.5.2 系統需求 / 14 1.5.3 構建編譯環境 / 15 1.5.4 準備依賴項 / 17 1.5.5 進行編譯 / 18 1.6 本章小結 / 21 第二部分 自動記憶體管理機制 第2章 Java記憶體區域與記憶體溢位異常 / 24 2.1 概述 / 24 2.2 執行時資料區域 / 25 2.2.1 程式計數器 / 25 2.2.2 Java虛擬機器棧 / 26 2.2.3 本地方法棧 / 27 2.2.4 Java堆 / 27 2.2.5 方法區 / 28 2.2.6 執行時常量池 / 29 2.2.7 直接記憶體 / 29 2.3 物件訪問 / 30 2.4 實戰:OutOfMemoryError異常 / 32 2.4.1 Java堆溢位 / 32 2.4.2 虛擬機器棧和本地方法棧溢位 / 35 2.4.3 執行時常量池溢位 / 38 2.4.4 方法區溢位 / 39 2.4.5 本機直接記憶體溢位 / 41 2.5 本章小結 / 42 第3章 垃圾收集器與記憶體分配策略 / 43 3.1 概述 / 43 3.2 物件已死? / 44 3.2.1 引用計數演算法 / 44 3.2.2 根搜尋演算法 / 46 3.2.3 再談引用 / 47 3.2.4 生存還是死亡? / 48 3.2.5 回收方法區 / 50 3.3 垃圾收集演算法 / 51 3.3.1 標記 -清除演算法 / 51 3.3.2 複製演算法 / 52 3.3.3 標記-整理演算法 / 54 3.3.4 分代收集演算法 / 54 3.4 垃圾收集器 / 55 3.4.1 Serial收集器 / 56 3.4.2 ParNew收集器 / 57 3.4.3 Parallel Scavenge收集器 / 59 3.4.4 Serial Old收集器 / 60 3.4.5 Parallel Old收集器 / 61 3.4.6 CMS收集器 / 61 3.4.7 G1收集器 / 64 3.4.8 垃圾收集器引數總結 / 64 3.5 記憶體分配與回收策略 / 65 3.5.1 物件優先在Eden分配 / 66 3.5.2 大物件直接進入老年代 / 68 3.5.3 長期存活的物件將進入老年代 / 69 3.5.4 動態物件年齡判定 / 71 3.5.5 空間分配擔保 / 73 3.6 本章小結 / 75 第4章 虛擬機器效能監控與故障處理工具 / 76 4.1 概述 / 76 4.2 JDK的命令列工具 / 76 4.2.1 jps:虛擬機器程序狀況工具 / 79 4.2.2 jstat:虛擬機器統計資訊監視工具 / 80 4.2.3 jinfo:Java配置資訊工具 / 82 4.2.4 jmap:Java記憶體映像工具 / 82 4.2.5 jhat:虛擬機器堆轉儲快照分析工具 / 84 4.2.6 jstack:Java堆疊跟蹤工具 / 85 4.3 JDK的視覺化工具 / 87 4.3.1 JConsole:Java監視與管理控制檯 / 88 4.3.2 VisualVM:多合一故障處理工具 / 96 4.4 本章小結 / 105 第5章 調優案例分析與實戰 / 106 5.1 概述 / 106 5.2 案例分析 / 106 5.2.1 高效能硬體上的程式部署策略 / 106 5.2.2 叢集間同步導致的記憶體溢位 / 109 5.2.3 堆外記憶體導致的溢位錯誤 / 110 5.2.4 外部命令導致系統緩慢 / 112 5.2.5 伺服器JVM程序崩潰 / 113 5.3 實戰:Eclipse執行速度調優 / 114 5.3.1 調優前的程式執行狀態 / 114 5.3.2 升級JDK 1.6的效能變化及相容問題 / 117 5.3.3 編譯時間和類載入時間的優化 / 122 5.3.4 調整記憶體設定控制垃圾收集頻率 / 126 5.3.5 選擇收集器降低延遲 / 130 5.4 本章小結 / 133 第三部分 虛擬機器執行子系統 第6章 類檔案結構 / 136 6.1 概述 / 136 6.2 無關性的基石 / 136 6.3 Class類檔案的結構 / 138 6.3.1 魔數與Class檔案的版本 / 139 6.3.2 常量池 / 141 6.3.3 訪問標誌 / 147 6.3.4 類索引、父類索引與介面索引集合 / 148 6.3.5 欄位表集合 / 149 6.3.6 方法表集合 / 153 6.3.7 屬性表集合 / 155 6.4 Class檔案結構的發展 / 168 6.5 本章小結 / 170 第7章 虛擬機器類載入機制 / 171 7.1 概述 / 171 7.2 類載入的時機 / 172 7.3 類載入的過程 / 176 7.3.1 載入 / 176 7.3.2 驗證 / 178 7.3.3 準備 / 181 7.3.4 解析 / 182 7.3.5 初始化 / 186 7.4 類載入器 / 189 7.4.1 類與類載入器 / 189 7.4.2 雙親委派模型 / 191 7.4.3 破壞雙親委派模型 / 194 7.5 本章小結 / 197 第8章 虛擬機器位元組碼執行引擎 / 198 8.1 概述 / 198 8.2 執行時棧幀結構 / 199 8.2.1 區域性變量表 / 199 8.2.2 運算元棧 / 204 8.2.3 動態連線 / 206 8.2.4 方法返回地址 / 206 8.2.5 附加資訊 / 207 8.3 方法呼叫 / 207 8.3.1 解析 / 207 8.3.2 分派 / 209 8.4 基於棧的位元組碼解釋執行引擎 / 221 8.4.1 解釋執行 / 221 8.4.2 基於棧的指令集與基於暫存器的指令集 / 223 8.4.3 基於棧的直譯器執行過程 / 224 8.5 本章小結 / 230 第9章 類載入及執行子系統的案例與實戰 / 231 9.1 概述 / 231 9.2 案例分析 / 231 9.2.1 Tomcat:正統的類載入器架構 / 232 9.2.2 OSGi:靈活的類載入器架構 / 235 9.2.3 位元組碼生成技術與動態代理的實現 / 238 9.2.4 Retrotranslator:跨越JDK版本 / 242 9.3 實戰:自己動手實現遠端執行功能 / 246 9.3.1 目標 / 246 9.3.2 思路 / 247 9.3.3 實現 / 248 9.3.4 驗證 / 255 9.4 本章小結 / 256 第四部分 程式編譯與程式碼優化 第10章 早期(編譯期)優化 / 258 10.1 概述 / 258 10.2 Javac編譯器 / 259 10.2.1 Javac的原始碼與除錯 / 259 10.2.2 解析與填充符號表 / 262 10.2.3 註解處理器 / 264 10.2.4 語義分析與位元組碼生成 / 264 10.3 Java語法糖的味道 / 268 10.3.1 泛型與型別擦除 / 268 10.3.2 自動裝箱、拆箱與遍歷迴圈 / 273 10.3.3 條件編譯 / 275 10.4 實戰:插入式註解處理器 / 276 10.4.1 實戰目標 / 276 10.4.2 程式碼實現 / 277 10.4.3 執行與測試 / 284 10.4.4 其他應用案例 / 286 10.5 本章小結 / 286 第11章 晚期(執行期)優化 / 287 11.1 概述 / 287 11.2 HotSpot虛擬機器內的即時編譯器 / 288 11.2.1 直譯器與編譯器 / 288 11.2.2 編譯物件與觸發條件 / 291 11.2.3 編譯過程 / 294 11.2.4 檢視與分析即時編譯結果 / 297 11.3 編譯優化技術 / 301 11.3.1 優化技術概覽 / 301 11.3.2 公共子表示式消除 / 305 11.3.3 陣列邊界檢查消除 / 307 11.3.4 方法內聯 / 307 11.3.5 逃逸分析 / 309 11.4 Java與C/C++的編譯器對比 / 311 11.5 本章小結 / 313 第五部分 高效併發 第12章 Java記憶體模型與執行緒 / 316 12.1 概述 / 316 12.2 硬體的效率與一致性 / 317 12.3 Java記憶體模型 / 318 12.3.1 主記憶體與工作記憶體 / 319 12.3.2 記憶體間互動操作 / 320 12.3.3 對於volatile型變數的特殊規則 / 322 12.3.4 對於long和double型變數的特殊規則 / 327 12.3.5 原子性、可見性與有序性 / 328 12.3.6 先行發生原則 / 330 12.4 Java與執行緒 / 333 12.4.1 執行緒的實現 / 333 12.4.2 Java執行緒排程 / 337 12.4.3 狀態轉換 / 339 12.5 本章小結 / 341 第13章 執行緒安全與鎖優化 / 342 13.1 概述 / 342 13.2 執行緒安全 / 343 13.2.1 Java語言中的執行緒安全 / 343 13.2.2 執行緒安全的實現方法 / 348 13.3 鎖優化 / 356 13.3.1 自旋鎖與自適應自旋 / 356 13.3.2 鎖消除 / 357 13.3.3 鎖粗化 / 358 13.3.4 輕量級鎖 / 358 13.3.5 偏向鎖 / 361 13.4 本章小結 / 362 附錄A Java虛擬機器家族 / 363 附錄B 虛擬機器位元組碼指令表 / 366 附錄C HotSpot虛擬機器主要引數表 / 372 附錄D 物件查詢語言(OQL)簡介 / 376 附錄E JDK歷史版本軌跡 / 383