●第一部分虛擬機基礎
第1章虛擬機簡介 2
1.1虛擬機類型 2
1.2為什麼需要虛擬機 3
1.3虛擬機示例 4
1.3.1JavaScript引擎 4
1.3.2Perl引擎 5
1.3.3AndroidJavaVM 5
1.3.4ApacheHarmony 6
第2章虛擬機內部組成 7
2.1虛擬機核心組件 7
2.1.1加載器與動態鏈接器 7
2.1.2執行引擎 8
2.1.3內存管理器 8
2.1.4線程調度器 9
2.1.5語言擴展 9
2.1.6傳統模型與虛擬機模型 10
2.2虛擬ISA 11
2.2.1JVM 12
2.2.2JVM與CLR 15
第3章虛擬機中的數據結構 17
3.1對像與類 17
3.2對像表示 18
3.3方法描述 18
第二部分虛擬機設計
第4章執行引擎設計 22
4.1解釋器 22
4.1.1超級指令 23
4.1.2選擇性內聯 23
4.2JIT編譯 23
4.2.1基於方法的JIT 24
4.2.2基於蹤跡的JIT 26
4.2.3基於區域的JIT 29
4.3解釋器與JIT編譯器的關繫 30
4.4AOT編譯 31
4.5編譯時與運行時 33
第5章垃圾回收設計 37
5.1對像生存期 37
5.2引用計數 38
5.3對像追蹤 40
5.4RC與對像追蹤 42
5.5GC安全點 43
5.6常用追蹤GC算法 45
5.6.1標記清除 46
5.6.2追蹤復制 46
5.7常用追蹤GC變體 48
5.7.1標記壓縮 48
5.7.2滑動壓縮 48
5.7.3追蹤轉發 49
5.7.4標記復制 50
5.7.5分代式GC 50
5.8移動式GC與非移動式GC 53
5.8.1數據局部性 53
5.8.2跳增指針分配 53
5.8.3空閑列表與分配位圖 53
5.8.4離散大小列表 54
5.8.5標記位與分配位 54
5.8.6線程局部分配 55
5.8.7移動式GC與非移動式GC的混合 56
第6章線程設計 58
6.1什麼是線程 58
6.2內核線程與用戶線程 59
6.3VM線程到OS線程的映射 61
6.4同步構件 63
6.5monitor 65
6.5.1互斥 65
6.5.2條件變量 66
6.5.3monitorenter 66
6.5.4monitorexit 69
6.5.5Object.wait() 71
6.5.6Object.notify() 71
6.6原子 73
6.7monitor與原子 75
6.7.1阻塞與非阻塞 75
6.7.2中央控制點 75
6.7.3鎖與非鎖 75
6.7.4非阻塞之上的阻塞 76
6.8回收器與修改器 77
6.9線程局部數據 78
6.10GC的線程暫停支持 81
6.10.1GC安全點 81
6.10.2GC安全區域 83
6.10.3基於鎖的安全點 86
6.10.4回收中的線程交互 87
第三部分虛擬機內部支持
第7章本地接口 92
7.1為何需要本地接口 92
7.2從托管代碼到本地代碼的轉換 93
7.2.1本地方法封裝 94
7.2.2封裝代碼的GC支持 96
7.2.3封裝代碼的同步支持 98
7.3本地方法實現的綁定 99
7.4本地代碼到托管代碼的轉換 99
7.5本地代碼到本地代碼的轉換 102
7.5.1通過JNIAPI的本地到本地轉換 102
7.5.2為什麼在本地到本地轉換中使用JNIAPI 105
第8章棧展開 107
8.1為何需要棧展開 107
8.2Java方法幀的棧展開 108
8.2.1棧展開設計 108
8.2.2棧展開實現 110
8.3本地方法幀的棧展開 112
8.3.1棧展開設計 112
8.3.2Java到本地封裝設計 114
8.3.3棧展開實現 116
8.3.4本地幀與C幀 117
第9章垃圾回收支持 119
9.1為何需要垃圾回收支持 119
9.2在Java代碼中支持垃圾回收 121
9.2.1GC-map 121
9.2.2帶寄存器的棧展開 124
9.3在本地代碼中支持垃圾回收 126
9.3.1對像引用訪問 127
9.3.2對像句柄實現 129
9.3.3GC安全性維護 132
9.3.4對像體訪問 133
9.3.5對像分配 135
9.4在同步方法中支持垃圾回收 136
9.4.1同步Java方法 136
9.4.2同步本地方法 138
9.5Java與本地代碼轉換中的GC支持 140
9.5.1本地到Java 140
9.5.2Java到本地 142
9.5.3本地到本地 142
9.6全局根集 144
第10章運行時輔助 145
10.1為何需要運行時輔助 145
10.2帶運行時輔助的VM服務設計 147
10.2.1運行時輔助操作 147
10.2.2運行時輔助實現 148
10.2.3JNIAPI作為運行時輔助 150
10.3沒有運行時輔助的VM服務設計 151
10.3.1運行時輔助的快速路徑 153
10.3.2快速路徑VM服務編程 154
10.4主要VM服務 154
第11章異常拋出 157
11.1保存異常拋出上下文 157
11.1.1VM保存的上下文 158
11.1.2Linux中OS保存的上下文 158
11.1.3Windows中OS保存的上下文 159
11.1.4同步與異步異常 160
11.2本地代碼內與跨本地代碼異常處理 161
11.2.1本地代碼內的異常處理 161
11.2.2帶異常Java代碼返回到本地代碼 162
11.2.3帶異常的本地代碼返回到Java代碼 166
11.3保存棧軌跡 167
11.4找到異常處理器 169
11.5控制轉移 172
11.5.1控制轉移操作 172
11.5.2用於控制轉移的寄存器 173
11.5.3數據寄存器恢復 174
11.5.4控制寄存器修正 176
11.5.5執行恢復 176
11.5.6未捕獲異常 179
第12章終結與弱引用 180
12.1終結 180
12.2為何需要弱引用 182
12.3對像生存期狀態 184
12.3.1對像狀態轉換 185
12.3.2引用隊列 187
12.3.3引用對像狀態轉換 187
12.4引用對像實現 189
12.5引用對像處理順序 191
第13章虛擬機模塊化設計 194
13.1VM組件 194
13.2對像信息暴露 197
13.3垃圾回收器接口 199
13.4執行引擎接口 202
13.5跨組件優化 203
第四部分垃圾回收優化
第14章針對吞吐量的GC優化 208
14.1部分堆回收與全堆回收之間的適應性調整 208
14.2分代式與非分代式算法之間的適應性調整 213
14.3堆的空間大小的適應性調整 217
14.3.1空間大小擴展 218
14.3.2NOS大小 219
14.3.3部分轉發NOS設計 221
14.3.4半空間NOS設計 221
14.3.5aged-matureNOS設計 223
14.3.6回退回收 225
14.4分配空間之間的適應性調整 225
14.5大OS頁與預取 230
第15章針對可擴展性的GC優化 232
15.1回收階段 232
15.2並行對像圖遍歷 233
15.2.1任務共享 234
15.2.2工作偷取 234
15.2.3任務推送 235
15.3並行對像標記 238
15.4並行壓縮 239
15.4.1並行LISP2壓縮器 239
15.4.2對像依賴樹 241
15.4.3帶用於轉發指針的目標表的壓縮器 244
15.4.4基於對像節的壓縮器 246
15.4.5單趟就地壓縮器 247
第16章針對響應性的GC優化 249
16.1區域式GC 249
16.2並發追蹤 252
16.2.1起始快照 252
16.2.2增量更新 256
16.2.3用三色術語表示並發追蹤 259
16.2.4使用讀屏障的並發追蹤 260
16.3並發根集枚舉 261
16.3.1並發根集枚舉設計 262
16.3.2在根集枚舉過程中追蹤堆 265
16.3.3並發棧掃描 266
16.4並發回收調度 267
16.4.1調度並發根集枚舉 267
16.4.2調度並發堆追蹤 269
16.4.3並發回收調度 271
16.4.4並發回收階段轉換 272
第17章並發移動式回收 277
17.1並發復制:“目標空間不變” 277
17.1.1基於槽位的“目標空間不變”算法 277
17.1.2“目標空間不變”性 280
17.1.3對像轉發 282
17.1.4基於對像的“目標空間不變”算法 283
17.1.5基於虛擬內存的“目標空間不變”算法 285
17.2並發復制:“當前副本不變” 286
17.2.1對像移動風暴 286
17.2.2“當前副本不變”設計 287
17.2.3並發復制與並發堆追蹤的關繫 289
17.3並發復制:“源空間不變” 292
17.3.1“源空間不變”設計 292
17.3.2部分轉發“源空間不變”設計 294
17.4無STW的完整並發移動 295
17.5並發壓縮回收 296
17.5.1並發區域復制式回收 296
17.5.2基於虛擬內存的並發壓縮 299
第五部分線程交互優化
第18章monitor性能優化 308
18.1惰性鎖 308
18.2瘦鎖 310
18.2.1瘦鎖鎖定路徑 310
18.2.2瘦鎖解鎖路徑 313
18.2.3競爭標志重置支持 316
18.3胖鎖 318
18.3.1整合monitor數據結構 318
18.3.2交由OS來支持 319
18.3.3瘦鎖膨脹為胖鎖 321
18.3.4休眠等待被競爭瘦鎖 324
18.4Tasuki鎖 327
18.4.1將同一個胖鎖monitor用於競爭控制 327
18.4.2胖鎖收縮為瘦鎖 331
18.5線程局部鎖334
18.5.1鎖保留 335
18.5.2線程親密鎖 339
第19章基於硬件事務內存的設計 346
19.1硬件事務內存 346
19.1.1從事務數據庫到事務內存 346
19.1.2Intel的HTM實現 347
19.2使用HTM的monitor實現 348
19.2.1基於HTM的monitor的正確性問題 349
19.2.2基於HTM的monitor的性能問題 352
19.3使用HTM的並發垃圾回收 355
19.3.1GC中HTM的機會 355
19.3.2復制式回收 357
19.3.3壓縮式回收 360
參考文獻 364