第1章 初識HotSpot
1.1 JDK概述
1.1.1 JCP與JSR
1.1.2 JDK的發展歷程
1.1.3 Java 7的語法變化
1.2 動手編譯虛擬機
1.2.1 源代碼下載
1.2.2 HotSpot源代碼結構
1.2.3 搭建編譯環境
1.2.4 編譯目標
1.2.5 編譯過程
1.2.6 編譯常見問題
1.3 實戰:在HotSpot內調試HelloWorld
1.3.1 認識GDB
1.3.2 準備調試腳本
1.4 小結
第2章 啟動
2.1 HotSpot內核
2.1.1 如何閱讀源代碼
2.1.2 HotSpot內核框架
2.1.3 Prims
2.1.4 Services
2.1.5 Runtime
2.2 啟動
2.2.1 Launcher
2.2.2 虛擬機生命周期
2.2.3 入口:main函數
2.2.4 主線程
2.2.5 InitializeJVM函數
2.2.6 JNI_CreateJavaVM函數
2.2.7 調用Java主方法
2.2.8 JVM退出路徑
2.3 系統初始化
2.3.1 配置OS模塊
2.3.2 配置系統屬性
2.3.3 加載系統庫
2.3.4 啟動線程
2.3.5 vm_init_globals函數:初始化全局數據結構
2.3.6 init_globals函數:初始化全局模塊
2.4 小結
第3章 類與對象
3.1 對象表示機制
3.1.1 OOP-Klass二分模型
3.1.2 Oops模塊
3.1.3 OOP框架與對象訪問機制
3.1.4 Klass與instanceKlass
3.1.5 實戰:用HSDB調試HotSpot
3.2 類的狀態轉換
3.2.1 入口:Class文件
3.2.2 類的狀態
3.2.3 加載
3.2.4 鏈接
3.2.5 初始化
3.2.6 實戰:類的“族譜”
3.2.7 實戰:系統字典
3.3 創建對象
3.3.1 實例對象的創建流程
3.3.2 實戰:探測JVM內部對象
3.4 小結
第4章 運行時數據區
4.1 堆
4.1.1 Java的自動內存管理
4.1.2 堆的管理
4.2 線程私有區域
4.2.1 PC
4.2.2 JVM棧
4.3 方法區
4.3.1 紐帶作用
4.3.2 常量池
4.3.3 常量池緩存:ConstantPoolCache
4.3.4 方法的表示:methodOop
4.3.5 方法的解析:將符號引用轉換成直接引用
4.3.6 代碼放在哪裏:ConstMethodOop
4.3.7 實戰:探測運行時常量池
4.4 性能監控數據區:Perf Data
4.4.1 描述這段空間:PerfMemory
4.4.2 查看
4.4.3 生產
4.5 轉儲
4.5.1 用VisualVM進行轉儲分析
4.5.2 JVM Crash
4.6 小結
第5章 垃圾收集
5.1 堆與GC
5.1.1 垃圾收集
5.1.2 分代收集
5.1.3 快速分配
5.1.4 棧上分配和逸出分析
5.1.5 GC公***模塊
5.2 垃圾收集器
5.2.1 設計演進
5.2.2 CMS收集器
5.2.3 G1收集器
5.3 實戰:性能分析方法
5.3.1 獲取GC日誌
5.3.2 GC監控信息
5.3.3 內存分析工具
5.3.4 選擇合適的收集器與GC性能評估
5.3.5 不要忽略JVM Crash日誌
5.4 小結
第6章 棧
6.1 硬件背景:了解真實機器
6.1.1 程序是如何運行的
6.1.2 x86與棧幀
6.1.3 ARM對Java硬件級加速:Jazelle技術
6.2 Java棧
6.2.1 寄存器式指令集與棧式指令集
6.2.2 HotSpot中的棧
6.2.3 棧幀
6.2.4 充分利用寄存器資源
6.2.5 虛擬機如何調用Java函數
6.2.6 優化:棧頂緩存
6.2.7 實戰:操作數棧
6.3 小結
第7章 解釋器和即時編譯器
7.1 概述
7.2 解釋器如何工作
7.2.1 Interpreter模塊
7.2.2 Code模塊
7.2.3 字節碼表
7.2.4 Code Cache
7.2.5 InterpreterCodelet與Stubs隊列
7.2.6 Code生成器
7.2.7 模板表與轉發表
7.2.8 實戰:InterpreterCodelet
7.3 即時編譯器
7.3.1 概述
7.3.2 編譯器模塊
7.3.3 編譯器的基本結構
7.3.4 實戰:編譯原理實踐,了解編譯中間環節
7.4 小結
第8章 指令集
8.1 再說棧式指令集
8.2 數據傳送
8.2.1 局部變量、常量池和操作數棧之間的數據傳送
8.2.2 數據傳送指令
8.2.4 實戰:數組的越界檢查
8.3 類型轉換
8.4 對象的創建和操作
8.5 程序流程控制
8.5.1 控制轉移指令
8.5.2 條件轉移
8.5.3 無條件轉移
8.5.4 復合條件轉移
8.5.5 實戰:switch語句如何使用String
8.6 運算
8.6.1 加法:iadd
8.6.2 取負:ineg
8.7 函數的調用和返回
8.7.1 Java函數分發機制:VTABLE與ITABLE
8.7.2 invoke系列指令
8.7.3 動態分發:覆蓋
8.7.4 靜態分發:重載
8.8 異常
8.8.1 異常表
8.8.2 創建異常
8.8.3 try-catch
8.8.4 finally
8.9 小結
第9章 虛擬機監控工具
9.1 Attach機制
9.1.1 AttachProvider與VirtualMachine
9.1.2 命令的下發:execute()
9.1.3 命令的執行:Attach Listener守護線程
9.2 查看JVM進程
9.2.1 用jps查看Java進程
9.2.2 實戰:定制jps,允許查看庫路徑
9.3 查看和配置JVM
9.3.1 用jinfo查看JVM參數配置
9.3.2 實戰:擴展flags選項,允許查看命令行參數
9.4 堆內存轉儲工具
9.4.1 Heap Dump
9.4.2 原理
9.5 堆轉儲分析
9.5.1 Heap Dump分析工具:jhat
9.5.2 實戰:MAT分析過程
9.6 線程轉儲分析
9.6.1 jstack
9.6.2 實戰:如何分析資源等待
9.7 小結