內容簡介
HotSpotVM是目前市面上高性能JVM的代表作之一,它採用解釋器+JIT編譯器的混合執行引擎,使得Java 程式的執行性能從此有了質的飛躍。《Java虛擬機精講》以極其精練的語句詮釋了HotSpot VM 的方方面面,比如:位元組碼的編譯原理、位元組碼的內部組成結構、通過源碼的方式剖析HotSpot VM 的啟動過程和初始化過程、Java虛擬機的運行時記憶體、垃圾收集算法、垃圾收集器(重點講解了Serial 收集器、ParNew 收集器、Parallel 收集器、CMS(Concurrent-Mark-Sweep)收集器和G1(Garbage-First)收集器)、類載入機制,以及HotSpot VM 基於棧的架構模型和執行引擎(解釋器的工作流程、JIT 編譯器的工作流程、分層編譯策略、熱點探測功能)等技術。
作者簡介
高翔龍,曾任平安科技高級架構師,負責高並發即時通訊系統“天下通”的系統架構設計、架構最佳化、核心功能研發等工作,就職於一家網際網路創業公司,擔任系統架構師,負責企業內部Hadoop大數據平台的推廣和實施、系統性能調優、對新員工技術培訓等工作,對系統架構設計、大數據、Java虛擬機等技術領域有著濃厚的興趣和豐富的實戰經驗。
內容提要
HotSpot VM 是當前市面上高性能JVM 的代表作之一,它採用解釋器+JIT 編譯器的混合執行引擎,使得Java 程式的執行性能從此有了質的飛躍。《Java虛擬機精講》以極其精練的語句詮釋了HotSpot VM 的方方面面,比如:位元組碼的編譯原理、位元組碼的內部組成結構、通過源碼的方式剖析HotSpot VM 的啟動過程和初始化過程、Java 虛擬機的運行時記憶體、垃圾收集算法、垃圾收集器(重點講解了Serial 收集器、ParNew 收集器、Parallel 收集器、CMS(Concurrent-Mark-Sweep)收集器和G1(Garbage-First)收集器)、類載入機制,以及HotSpot VM 基於棧的架構模型和執行引擎(解釋器的工作流程、JIT 編譯器的工作流程、分層編譯策略、熱點探測功能)等技術。
目錄
第1 章Java 體系結構....................................... 1
1.1 認識Java................................................ 1
1.1.1 與生俱來的優點......................... 2
1.1.2 語法結構和對象模型.................. 4
1.1.3 歷史版本追溯............................. 5
1.2 Java 重要概念....................................... 7
1.2.1 Java 程式語言............................. 7
1.2.2 位元組碼......................................... 7
1.2.3 Java API....................................... 8
1.2.4 Java 虛擬機................................. 8
1.3 安裝與配置Java 運行環境.............. 10
1.3.1 Windows 環境下的安裝與配置........................................... 10
1.3.2 Linux 環境下的安裝與配置..... 11
1.3.3 編寫Java 程式.......................... 12
1.3.4 編譯與運行............................... 13
1.3.5 關鍵字與標示符....................... 13
1.4 Java 技術的新特性............................ 14
1.4.1 Java 模組化與OSGi 技術........ 14
1.4.2 語言無關性............................... 15
1.4.3 使用Fork/Join 框架實現多核並行....................................... 16
1.4.4 豐富的語法特性....................... 17
1.4.5 過渡到64 位虛擬機................. 18
1.5 實戰:玩轉OpenJDK....................... 19
1.5.1 JDK與OpenJDK 的關係......... 19
1.5.2 基於OpenJDK 深度定製的淘寶JVM(TaobaoVM)........ 20
1.5.3 下載OpenJDK 原始碼............. 22
1.5.4 構建編譯環境........................... 22
1.5.5 執行整個OpenJDK 的編譯..... 23
1.5.6 執行單獨HotSpot 的編譯........ 26
1.5.7 導致編譯失敗的一些疑難雜症........................................... 29
1.5.8 使用GDB 工具Debug HotSpot...................................... 30
1.6 本章小結.............................................. 36
第2 章位元組碼的編譯原理............................. 37
2.1 javac 編譯器簡介............................... 37
2.1.1 javac 與Eclipse Compiler for
Java 編譯器............................... 38
2.1.2 javac 的使用與標準選項配置.. 39
2.1.3 編譯原理................................... 40
2.1.4 下載javac 編譯器源碼............. 41
2.1.5 調用compile()方法執行編譯... 41
2.2 詞法解析步驟..................................... 43
2.2.1 Token 序列................................ 45
2.2.2 源碼字元集合與Token 之間的對應關係............................... 47
2.2.3 調用key()方法獲取指定Token......................................... 48
2.2.4 調用nextToken()方法計算Token 的獲取規則.................... 48
2.2.5 調用parseCompilationUnit()方法執行詞法解析................... 49
2.3 語法解析步驟..................................... 51
2.3.1 調用qualident()方法解析package 語法節點..................... 52
2.3.2 調用importDeclaration()方法解析import 語法樹........... 54
2.3.3 調用classDeclaration()方法解析class 語法樹.............. 56
2.4 語義解析步驟..................................... 59
2.5 生成位元組碼.......................................... 61
2.6 實戰:使用javap 工具分析位元組碼................................................... 62
2.7 實戰:使用GCJ 編譯器將Java源碼直接編譯為本地機器指令...... 64
2.8 本章小結.............................................. 66
第3 章位元組碼檔案........................................... 67
3.1 位元組碼檔案的內部組成結構........... 67
3.2 符號引用.............................................. 73
3.2.1 類或者接口的全限定名............ 74
3.2.2 簡單名稱................................... 74
3.2.3 描述符....................................... 74
3.3 常量池.................................................. 76
3.3.1 CONSTANT_Utf8_info常量項....................................... 77
3.3.2 CONSTANT_Integer_info常量項....................................... 77
3.3.3 CONSTANT_Float_info常量項....................................... 78
3.3.4 CONSTANT_Long_info常量項....................................... 78
3.3.5 CONSTANT_Double_info常量項....................................... 79
3.3.6 CONSTANT_Class_info常量項....................................... 79
3.3.7 CONSTANT_String_info常量項....................................... 80
3.3.8 CONSTANT_Fieldref_info常量項....................................... 81
3.3.9 CONSTANT_Methodref_info常量項....................................... 81
3.3.10 CONSTANT_InterfaceMethodref_info 常量項............................ 82
3.3.11 CONSTANT_NameAndType_info 常量項............................ 82
3.3.12 CONSTANT_MethodHandle_info 常量項............................ 83
3.3.13 CONSTANT_MethodType_info 常量項............................ 84
3.3.14 CONSTANT_InvokeDynamic_info 常量項............................ 84
3.4 欄位表.................................................. 85
3.5 方法表.................................................. 86
3.6 屬性表.................................................. 88
3.6.1 Code 屬性.................................. 89
3.6.2 ConstantValue 屬性.................. 90
3.6.3 Exceptions 屬性........................ 91
3.6.4 LineNumberTable 屬性............. 92
3.6.5 SourceFile 屬性......................... 93
3.6.6 LocalVariableTable 屬性.......... 93
3.6.7 InnerClasses 屬性...................... 94
3.6.8 BootstrapMethods 屬性............. 95
3.7 本章小結.............................................. 96
第4 章剖析HotSpot 的Launcher .............. 97
4.1 HotSpot 的源碼目錄結構................. 97
4.2 Launcher 簡介..................................... 99
4.3 跟蹤Launcher 的執行過程............ 101
4.3.1 使用Launcher 啟動JVM........ 101
4.3.2 啟動函式main()...................... 102
4.3.3 在主執行緒中執行JavaMain()函式......................................... 106
4.3.4 調用JNI_CreateJavaVM()函式初始化HotSpot ............... 114
4.3.5 調用LoadClass()函式獲取Java 啟動類............................. 115
4.3.6 調用GetStaticMethodId()函式獲取Java 啟動方法......... 116
4.3.7 調用CallStaticVoidMethod()函式執行Java 啟動方法......... 116
4.3.8 調用jni_DestroyJavaVM函式銷毀HotSpot ................... 119
4.4 實戰:在Launcher 中添加
自定義函式模組............................... 120
4.5 本章小結............................................ 121
第5 章剖析HotSpot 的初始化過程.......... 122
5.1 HotSpot 的構成模組........................ 122
5.2 Prims 模組......................................... 124
5.2.1 JNI 子模組............................... 124
5.2.2 JVM 子模組............................ 125
5.2.3 JVMTI 子模組......................... 128
5.2.4 Perf 子模組.............................. 129
5.3 Runtime 模組..................................... 129
5.3.1 Thread 子模組......................... 131
5.3.2 調用create_vm()函式完成HotSpot 的最終初始化........... 131
5.4 跟蹤HotSpot 的初始化過程.......... 140
5.4.1 調用init()和init_2()函式初始化os 模組........................ 141
5.4.2 調用vm_init_globals()函式初始化全局數據結構............. 144
5.4.3 調用init_globals()函式初始化全局模組..................... 144
5.5 本章小結............................................ 146
第6 章記憶體分配與垃圾回收....................... 147
6.1 JVM 的運行時記憶體區結構............ 147
6.2 執行緒共享記憶體區.............................. 148
6.2.1 Java 堆區................................. 148
6.2.2 方法區..................................... 150
6.2.3 運行時常量池......................... 150
6.3 執行緒私有記憶體區.............................. 150
6.3.1 PC 暫存器............................... 151
6.3.2 Java 棧..................................... 151
6.3.3 本地方法棧............................. 152
6.4 性能監控區....................................... 152
6.5 自動記憶體管理................................... 152
6.5.1 記憶體分配原理......................... 153
6.5.2 逃逸分析與棧上分配............. 157
6.5.3 對象記憶體布局與OOP-Klass模型......................................... 158
6.5.4 GC 的作用.............................. 159
6.5.5 垃圾標記:根搜尋算法......... 160
6.5.6 垃圾回收:分代收集算法..... 161
6.6 垃圾收集器....................................... 164
6.6.1 串列回收:Serial 收集器....... 165
6.6.2 並行回收:ParNew 收集器... 166
6.6.3 程式吞吐量優先:Parallel收集器..................................... 166
6.6.4 低延遲:CMS(Concurrent-Mark-Sweep)收集器............. 167
6.6.5 區域化分代式:G1(Garbage-First)收集器.......................... 170
6.6.6 垃圾收集的相關選項配置...... 172
6.7 實戰:GC 日誌分析........................ 175
6.7.1 不同GC 日誌的展示形式...... 175
6.7.2 使用GCHisto 工具分析離線日誌......................................... 179
6.8 實戰:分析dump 檔案................... 181
6.8.1 使用jmap 工具生成dump檔案......................................... 181
6.8.2 使用MAT(Memory Analyzer Tool)工具分析dump 檔案... 182
6.9 本章小結............................................ 184
第7 章類載入機制......................................... 185
7.1 類載入器............................................ 185
7.1.1 抽象類ClassLoader................. 187
7.1.2 雙親委派模型......................... 188
7.1.3 自定義類載入器..................... 191
7.1.4 定位ClassNotFoundException異常......................................... 193
7.1.5 定位NoClassDefFoundError異常......................................... 194
7.2 類的載入過程................................... 195
7.2.1 載入位元組碼............................. 198
7.2.2 驗證階段................................. 199
7.2.3 準備階段................................. 200
7.2.4 解析階段................................. 201
7.2.5 初始化階段............................. 201
7.3 實戰:位元組碼檔案的加密與解密..................................................... 204
7.4 本章小結............................................ 208
第8 章剖析HotSpot 的架構模型與執行引擎............................................. 209
8.1 棧幀的組成結構............................... 209
8.1.1 局部變數表............................. 211
8.1.2 運算元棧................................. 212
8.1.3 動態連結................................. 214
8.1.4 方法返回值............................. 216
8.2 HotSpot 中執行引擎的架構模型.................................................... 216
8.2.1 本地機器指令......................... 217
8.2.2 暫存器架構與棧式架構之間的區別..................................... 218
8.2.3 基於棧式架構的設計............. 221
8.2.4 調用call_stub()函式執行Java方法......................................... 222
8.2.5 棧頂快取(Top-of-Stack Cashing)技術......................................... 225
8.2.6 實戰:跟蹤位元組碼解釋器的執行步驟................................. 227
8.3 解釋器與JIT 編譯器...................... 230
8.3.1 查閱HotSpot 的運行時執行模式..................................... 231
8.3.2 解釋器的工作機制與構成模組......................................... 232
8.3.3 JIT 編譯器的工作機制與構成模組................................. 234
8.3.4 分層編譯策略......................... 235
8.3.5 熱點探測功能......................... 236
8.4 本章小結............................................ 239
附錄A Java7 新增語法特性........................ 241
A.1 try-with-resources 語句.................. 241
A.2 泛型的“<>”類型推斷運算符... 245
A.3 聲明二進制字面值......................... 247
A.4 字面值下畫線支持......................... 248
A.5 switch 表達式支持String 類型.... 250
A.6 mutil-catch 特性.............................. 251
A.7 NIO2.0 檔案系統的改變............... 255
附錄B 指令助記符......................................... 262