虛擬機(jī)設(shè)計(jì)與實(shí)現(xiàn) 以JVM為例
定 價(jià):129 元
- 作者:[中]李曉峰(Xiao-Feng Li)
- 出版時(shí)間:2020/1/1
- ISBN:9787115527288
- 出 版 社:人民郵電出版社
- 中圖法分類:TP312.8
- 頁(yè)碼:368
- 紙張:
- 版次:01
- 開本:16開
本書從一位虛擬機(jī)(VM)架構(gòu)師的角度,以易于理解、層層深入的方式介紹了各種主題和算法,尤其是不同VM通用的主要技術(shù)。這些算法用圖示充分解釋,用便于理解的代碼片段實(shí)現(xiàn),使得這些抽象概念對(duì)系統(tǒng)軟件工程師而言具像化并可編程。書中還包括一些同類文獻(xiàn)中較少涉及的主題,例如運(yùn)行時(shí)輔助、棧展開和本地接口。本書集理論性與實(shí)踐性于一身,不僅結(jié)合了高層設(shè)計(jì)功能與底層實(shí)現(xiàn),而且還結(jié)合了高級(jí)主題與商業(yè)解決方案,是VM設(shè)計(jì)和工程實(shí)踐方面的理想?yún)⒖甲x物。
在當(dāng)今的計(jì)算系統(tǒng)中,虛擬機(jī)已經(jīng)變得無處不在--從物聯(lián)網(wǎng)節(jié)點(diǎn)到移動(dòng)電話、個(gè)人計(jì)算機(jī),再到云平臺(tái)。因其所能賦予軟件的一些重要屬性,如安全性、高生產(chǎn)率和可移植性,虛擬機(jī)一直吸引著軟件研究人員和開發(fā)者的興趣和關(guān)注。
本書旨在通過循序漸進(jìn)、通俗易懂的方式講解虛擬機(jī)的通用技術(shù),主要以JVM設(shè)計(jì)為例,并兼顧其他虛擬機(jī)。本書還包括一些同類文獻(xiàn)中較少涉及的主題,例如運(yùn)行時(shí)輔助、棧展開和本地接口。本書是虛擬機(jī)設(shè)計(jì)和工程實(shí)踐方面的理想?yún)⒖甲x物,讀者若掌握書中的知識(shí)點(diǎn),便能為任意一種語(yǔ)言虛擬機(jī)的設(shè)計(jì)開發(fā)打下堅(jiān)實(shí)的基礎(chǔ)。
● 虛擬機(jī)基礎(chǔ):類型、內(nèi)部組成、數(shù)據(jù)結(jié)構(gòu)
● 虛擬機(jī)設(shè)計(jì):執(zhí)行引擎設(shè)計(jì)、垃圾回收設(shè)計(jì)、線程設(shè)計(jì)
● 虛擬機(jī)內(nèi)部支持:本地接口、棧展開、垃圾回收支持、運(yùn)行時(shí)輔助,等等
● 垃圾回收(GC)優(yōu)化:針對(duì)吞吐量的GC優(yōu)化、針對(duì)可擴(kuò)展性的GC優(yōu)化、針對(duì)響應(yīng)性的GC優(yōu)化、并發(fā)移動(dòng)式回收
● 線程交互優(yōu)化:monitor性
“本書論述了關(guān)于虛擬機(jī)設(shè)計(jì)與實(shí)現(xiàn)的高級(jí)主題,已經(jīng)成為我不可或缺的參考書。我向系統(tǒng)軟件開發(fā)者,尤其是托管運(yùn)行時(shí)系統(tǒng)的開發(fā)者,強(qiáng)烈推薦本書,因?yàn)楸緯軌蚯逦亟獯鹚麄冊(cè)谔剿魈摂M機(jī)相關(guān)話題時(shí)所產(chǎn)生的疑問!薄苤镜,F(xiàn)uturewei Technologies首席科學(xué)家
“當(dāng)前語(yǔ)言虛擬機(jī)的應(yīng)用范圍越來越廣,各類新的語(yǔ)言虛擬機(jī)也層出不窮,虛擬機(jī)技術(shù)的專業(yè)圖書卻不多見。本書是作者多年研究與實(shí)踐的心得與沉淀,值得一讀!薄影,華為硅谷基礎(chǔ)軟件實(shí)驗(yàn)室主任、華為Fellow
“關(guān)于虛擬機(jī)架構(gòu)的設(shè)計(jì),本書不但闡明了是什么,而且討論了為什么。作者從架構(gòu)師的角度高屋建瓴地分析了技術(shù)選擇背后的來龍去脈,相信讀者一定會(huì)受益匪淺!薄魑貔i,北卡羅來納州立大學(xué)計(jì)算機(jī)系教授
“虛擬機(jī)技術(shù)在編程語(yǔ)言、編譯器、計(jì)算機(jī)架構(gòu)、Web系統(tǒng)等領(lǐng)域均有深遠(yuǎn)的影響。作者具備這些領(lǐng)域的工作經(jīng)歷,本書的寫作也扎根于其在虛擬機(jī)研究及開發(fā)過程中的一手資料。本書通過循序漸進(jìn)的方式,將虛擬機(jī)技術(shù)融入豐富的示例與代碼中,使得讀者能夠同時(shí)在理論和實(shí)踐的層面充分理解虛擬機(jī)技術(shù)的精髓!薄熳忧啵ミ_(dá)高級(jí)軟件架構(gòu)師
“本書作者來自工業(yè)界,有著豐富的工程實(shí)踐經(jīng)驗(yàn)。書中同時(shí)包含了學(xué)術(shù)界在虛擬機(jī)相關(guān)領(lǐng)域的研究成果。其中重要的技術(shù)討論,既有代碼示例,又有理論分析,能幫助讀者透徹地理解虛擬機(jī)技術(shù)的要點(diǎn)、難點(diǎn)。”——林子超,美國(guó)高通研發(fā)總監(jiān)
【作者簡(jiǎn)介】
李曉峰(Xiao-Feng Li)
長(zhǎng)期從事系統(tǒng)軟件的研究與開發(fā),在并行計(jì)算、操作系統(tǒng)、編譯器和語(yǔ)言設(shè)計(jì)方面有著豐富的技術(shù)經(jīng)驗(yàn)。Apache Harmony JVM的主要貢獻(xiàn)者,所創(chuàng)建的一個(gè)微內(nèi)核VM被發(fā)展為Intel Micro Runtime。目前在一家大型科技公司任技術(shù)副總裁,致力于定義和開發(fā)基于移動(dòng)和智能設(shè)備的下一代分布式操作系統(tǒng)。擁有計(jì)算機(jī)科學(xué)博士學(xué)位,在閑暇時(shí)熱衷于人機(jī)交互方式的探索。
【譯者簡(jiǎn)介】
單業(yè)
計(jì)算機(jī)專業(yè)碩士,軟件工程師,曾供職于多家軟件公司,從事軟件開發(fā)工作,現(xiàn)居于上海。譯有《你不知道的JavaScript》中卷及下卷。
第 一部分 虛擬機(jī)基礎(chǔ)
第 1章 虛擬機(jī)簡(jiǎn)介 2
1.1 虛擬機(jī)類型 2
1.2 為什么需要虛擬機(jī) 3
1.3 虛擬機(jī)示例 4
1.3.1 JavaScript引擎 4
1.3.2 Perl引擎 5
1.3.3 Android Java VM 5
1.3.4 Apache Harmony 6
第 2章 虛擬機(jī)內(nèi)部組成 7
2.1 虛擬機(jī)核心組件 7
2.1.1 加載器與動(dòng)態(tài)鏈接器 7
2.1.2 執(zhí)行引擎 8
2.1.3 內(nèi)存管理器 8
2.1.4 線程調(diào)度器 9
2.1.5 語(yǔ)言擴(kuò)展 9
2.1.6 傳統(tǒng)模型與虛擬機(jī)模型 10
2.2 虛擬ISA 11
2.2.1 JVM 12
2.2.2 JVM與CLR 15
第3章 虛擬機(jī)中的數(shù)據(jù)結(jié)構(gòu) 17
3.1 對(duì)象與類 17
3.2 對(duì)象表示 18
3.3 方法描述 18
第二部分 虛擬機(jī)設(shè)計(jì)
第4章 執(zhí)行引擎設(shè)計(jì) 22
4.1 解釋器 22
4.1.1 超級(jí)指令 23
4.1.2 選擇性內(nèi)聯(lián) 23
4.2 JIT編譯 23
4.2.1 基于方法的JIT 24
4.2.2 基于蹤跡的JIT 26
4.2.3 基于區(qū)域的JIT 29
4.3 解釋器與JIT編譯器的關(guān)系 30
4.4 AOT編譯 31
4.5 編譯時(shí)與運(yùn)行時(shí) 33
第5章 垃圾回收設(shè)計(jì) 37
5.1 對(duì)象生存期 37
5.2 引用計(jì)數(shù) 38
5.3 對(duì)象追蹤 40
5.4 RC與對(duì)象追蹤 42
5.5 GC安全點(diǎn) 43
5.6 常用追蹤GC算法 45
5.6.1 標(biāo)記清除 46
5.6.2 追蹤復(fù)制 46
5.7 常用追蹤GC變體 48
5.7.1 標(biāo)記壓縮 48
5.7.2 滑動(dòng)壓縮 48
5.7.3 追蹤轉(zhuǎn)發(fā) 49
5.7.4 標(biāo)記復(fù)制 50
5.7.5 分代式GC 50
5.8 移動(dòng)式GC與非移動(dòng)式GC 53
5.8.1 數(shù)據(jù)局部性 53
5.8.2 跳增指針分配 53
5.8.3 空閑列表與分配位圖 53
5.8.4 離散大小列表 54
5.8.5 標(biāo)記位與分配位 54
5.8.6 線程局部分配 55
5.8.7 移動(dòng)式GC與非移動(dòng)式GC的混合 56
第6章 線程設(shè)計(jì) 58
6.1 什么是線程 58
6.2 內(nèi)核線程與用戶線程 59
6.3 VM線程到OS線程的映射 61
6.4 同步構(gòu)件 63
6.5 monitor 65
6.5.1 互斥 65
6.5.2 條件變量 66
6.5.3 monitorenter 66
6.5.4 monitorexit 69
6.5.5 Object.wait() 71
6.5.6 Object.notify() 71
6.6 原子 73
6.7 monitor與原子 75
6.7.1 阻塞與非阻塞 75
6.7.2 中央控制點(diǎn) 75
6.7.3 鎖與非鎖 75
6.7.4 非阻塞之上的阻塞 76
6.8 回收器與修改器 77
6.9 線程局部數(shù)據(jù) 78
6.10 GC的線程暫停支持 81
6.10.1 GC安全點(diǎn) 81
6.10.2 GC安全區(qū)域 83
6.10.3 基于鎖的安全點(diǎn) 86
6.10.4 回收中的線程交互 87
第三部分 虛擬機(jī)內(nèi)部支持
第7章 本地接口 92
7.1 為何需要本地接口 92
7.2 從托管代碼到本地代碼的轉(zhuǎn)換 93
7.2.1 本地方法封裝 94
7.2.2 封裝代碼的GC支持 96
7.2.3 封裝代碼的同步支持 98
7.3 本地方法實(shí)現(xiàn)的綁定 99
7.4 本地代碼到托管代碼的轉(zhuǎn)換 99
7.5 本地代碼到本地代碼的轉(zhuǎn)換 102
7.5.1 通過JNI API的本地到本地轉(zhuǎn)換 102
7.5.2 為什么在本地到本地轉(zhuǎn)換中使用JNI API 105
第8章 棧展開 107
8.1 為何需要棧展開 107
8.2 Java方法幀的棧展開 108
8.2.1 棧展開設(shè)計(jì) 108
8.2.2 棧展開實(shí)現(xiàn) 110
8.3 本地方法幀的棧展開 112
8.3.1 棧展開設(shè)計(jì) 112
8.3.2 Java到本地封裝設(shè)計(jì) 114
8.3.3 棧展開實(shí)現(xiàn) 116
8.3.4 本地幀與C幀 117
第9章 垃圾回收支持 119
9.1 為何需要垃圾回收支持 119
9.2 在Java代碼中支持垃圾回收 121
9.2.1 GC-map 121
9.2.2 帶寄存器的棧展開 124
9.3 在本地代碼中支持垃圾回收 126
9.3.1 對(duì)象引用訪問 127
9.3.2 對(duì)象句柄實(shí)現(xiàn) 129
9.3.3 GC安全性維護(hù) 132
9.3.4 對(duì)象體訪問 133
9.3.5 對(duì)象分配 135
9.4 在同步方法中支持垃圾回收 136
9.4.1 同步Java方法 136
9.4.2 同步本地方法 138
9.5 Java與本地代碼轉(zhuǎn)換中的GC支持 140
9.5.1 本地到Java 140
9.5.2 Java到本地 142
9.5.3 本地到本地 142
9.6 全局根集 144
第 10章 運(yùn)行時(shí)輔助 145
10.1 為何需要運(yùn)行時(shí)輔助 145
10.2 帶運(yùn)行時(shí)輔助的VM服務(wù)設(shè)計(jì) 147
10.2.1 運(yùn)行時(shí)輔助操作 147
10.2.2 運(yùn)行時(shí)輔助實(shí)現(xiàn) 148
10.2.3 JNI API作為運(yùn)行時(shí)輔助 150
10.3 沒有運(yùn)行時(shí)輔助的VM服務(wù)設(shè)計(jì) 151
10.3.1 運(yùn)行時(shí)輔助的快速路徑 153
10.3.2 快速路徑VM服務(wù)編程 154
10.4 主要VM服務(wù) 154
第 11章 異常拋出 157
11.1 保存異常拋出上下文 157
11.1.1 VM保存的上下文 158
11.1.2 Linux中OS保存的上下文 158
11.1.3 Windows中OS保存的上下文 159
11.1.4 同步與異步異!160
11.2 本地代碼內(nèi)與跨本地代碼異常處理 161
11.2.1 本地代碼內(nèi)的異常處理 161
11.2.2 帶異常Java代碼返回到本地代碼 162
11.2.3 帶異常的本地代碼返回到Java代碼 166
11.3 保存棧軌跡 167
11.4 找到異常處理器 169
11.5 控制轉(zhuǎn)移 172
11.5.1 控制轉(zhuǎn)移操作 172
11.5.2 用于控制轉(zhuǎn)移的寄存器 173
11.5.3 數(shù)據(jù)寄存器恢復(fù) 174
11.5.4 控制寄存器修正 176
11.5.5 執(zhí)行恢復(fù) 176
11.5.6 未捕獲異!179
第 12章 終結(jié)與弱引用 180
12.1 終結(jié) 180
12.2 為何需要弱引用 182
12.3 對(duì)象生存期狀態(tài) 184
12.3.1 對(duì)象狀態(tài)轉(zhuǎn)換 185
12.3.2 引用隊(duì)列 187
12.3.3 引用對(duì)象狀態(tài)轉(zhuǎn)換 187
12.4 引用對(duì)象實(shí)現(xiàn) 189
12.5 引用對(duì)象處理順序 191
第 13章 虛擬機(jī)模塊化設(shè)計(jì) 194
13.1 VM組件 194
13.2 對(duì)象信息暴露 197
13.3 垃圾回收器接口 199
13.4 執(zhí)行引擎接口 202
13.5 跨組件優(yōu)化 203
第四部分 垃圾回收優(yōu)化
第 14章 針對(duì)吞吐量的GC優(yōu)化 208
14.1 部分堆回收與全堆回收之間的適應(yīng)性調(diào)整 208
14.2 分代式與非分代式算法之間的適應(yīng)性調(diào)整 213
14.3 堆的空間大小的適應(yīng)性調(diào)整 217
14.3.1 空間大小擴(kuò)展 218
14.3.2 NOS大小 219
14.3.3 部分轉(zhuǎn)發(fā)NOS設(shè)計(jì) 221
14.3.4 半空間NOS設(shè)計(jì) 221
14.3.5 aged-mature NOS設(shè)計(jì) 223
14.3.6 回退回收 225
14.4 分配空間之間的適應(yīng)性調(diào)整 225
14.5 大OS頁(yè)與預(yù)取 230
第 15章 針對(duì)可擴(kuò)展性的GC優(yōu)化 232
15.1 回收階段 232
15.2 并行對(duì)象圖遍歷 233
15.2.1 任務(wù)共享 234
15.2.2 工作偷取 234
15.2.3 任務(wù)推送 235
15.3 并行對(duì)象標(biāo)記 238
15.4 并行壓縮 239
15.4.1 并行LISP2壓縮器 239
15.4.2 對(duì)象依賴樹 241
15.4.3 帶用于轉(zhuǎn)發(fā)指針的目標(biāo)表的壓縮器 244
15.4.4 基于對(duì)象節(jié)的壓縮器 246
15.4.5 單趟就地壓縮器 247
第 16章 針對(duì)響應(yīng)性的GC優(yōu)化 249
16.1 區(qū)域式GC 249
16.2 并發(fā)追蹤 252
16.2.1 起始快照 252
16.2.2 增量更新 256
16.2.3 用三色術(shù)語(yǔ)表示并發(fā)追蹤 259
16.2.4 使用讀屏障的并發(fā)追蹤 260
16.3 并發(fā)根集枚舉 261
16.3.1 并發(fā)根集枚舉設(shè)計(jì) 262
16.3.2 在根集枚舉過程中追蹤堆 265
16.3.3 并發(fā)棧掃描 266
16.4 并發(fā)回收調(diào)度 267
16.4.1 調(diào)度并發(fā)根集枚舉 267
16.4.2 調(diào)度并發(fā)堆追蹤 269
16.4.3 并發(fā)回收調(diào)度 271
16.4.4 并發(fā)回收階段轉(zhuǎn)換 272
第 17章 并發(fā)移動(dòng)式回收 277
17.1 并發(fā)復(fù)制:“目標(biāo)空間不變” 277
17.1.1 基于槽位的“目標(biāo)空間不變”算法 277
17.1.2 “目標(biāo)空間不變”性 280
17.1.3 對(duì)象轉(zhuǎn)發(fā) 282
17.1.4 基于對(duì)象的“目標(biāo)空間不變”算法 283
17.1.5 基于虛擬內(nèi)存的“目標(biāo)空間不變”算法 285
17.2 并發(fā)復(fù)制:“當(dāng)前副本不變” 286
17.2.1 對(duì)象移動(dòng)風(fēng)暴 286
17.2.2 “當(dāng)前副本不變”設(shè)計(jì) 287
17.2.3 并發(fā)復(fù)制與并發(fā)堆追蹤的關(guān)系 289
17.3 并發(fā)復(fù)制:“源空間不變” 292
17.3.1 “源空間不變”設(shè)計(jì) 292
17.3.2 部分轉(zhuǎn)發(fā)“源空間不變”設(shè)計(jì) 294
17.4 無STW的完整并發(fā)移動(dòng) 295
17.5 并發(fā)壓縮回收 296
17.5.1 并發(fā)區(qū)域復(fù)制式回收 296
17.5.2 基于虛擬內(nèi)存的并發(fā)壓縮 299
第五部分 線程交互優(yōu)化
第 18章 monitor性能優(yōu)化 308
18.1 惰性鎖 308
18.2 瘦鎖 310
18.2.1 瘦鎖鎖定路徑 310
18.2.2 瘦鎖解鎖路徑 313
18.2.3 競(jìng)爭(zhēng)標(biāo)志重置支持 316
18.3 胖鎖 318
18.3.1 整合monitor數(shù)據(jù)結(jié)構(gòu) 318
18.3.2 交由OS來支持 319
18.3.3 瘦鎖膨脹為胖鎖 321
18.3.4 休眠等待被競(jìng)爭(zhēng)瘦鎖 324
18.4 Tasuki鎖 327
18.4.1 將同一個(gè)胖鎖monitor用于競(jìng)爭(zhēng)控制 327
18.4.2 胖鎖收縮為瘦鎖 331
18.5 線程局部鎖 334
18.5.1 鎖保留 335
18.5.2 線程親密鎖 339
第 19章 基于硬件事務(wù)內(nèi)存的設(shè)計(jì) 346
19.1 硬件事務(wù)內(nèi)存 346
19.1.1 從事務(wù)數(shù)據(jù)庫(kù)到事務(wù)內(nèi)存 346
19.1.2 Intel的HTM實(shí)現(xiàn) 347
19.2 使用HTM的monitor實(shí)現(xiàn) 348
19.2.1 基于HTM的monitor的正確性問題 349
19.2.2 基于HTM的monitor的性能問題 352
19.3 使用HTM的并發(fā)垃圾回收 355
19.3.1 GC中HTM的機(jī)會(huì) 355
19.3.2 復(fù)制式回收 357
19.3.3 壓縮式回收 360
參考文獻(xiàn) 364