虛擬機設計與實現 以JVM為例( 簡體 字) | |
作者:[中]李曉峰(Xiao-Feng Li) | 類別:1. -> 程式設計 -> 程式設計 06 |
出版社:人民郵電出版社 | 3dWoo書號: 52289 詢問書籍請說出此書號! 有庫存 NT售價: 645 元 |
出版日:1/1/2020 | |
頁數:368 | |
光碟數:0 | |
站長推薦: | |
印刷:黑白印刷 | 語系: ( 簡體 字 ) |
ISBN:9787115527288 | 加入購物車 │加到我的最愛 (請先登入會員) |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社) | |
第 一部分 虛擬機基礎
第 1章 虛擬機簡介 2 1.1 虛擬機類型 2 1.2 為什么需要虛擬機 3 1.3 虛擬機示例 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章 虛擬機內部組成 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.1 JVM 12 2.2.2 JVM與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.2 JIT編譯 23 4.2.1 基于方法的JIT 24 4.2.2 基于蹤跡的JIT 26 4.2.3 基于區域的JIT 29 4.3 解釋器與JIT編譯器的關系 30 4.4 AOT編譯 31 4.5 編譯時與運行時 33 第5章 垃圾回收設計 37 5.1 對象生存期 37 5.2 引用計數 38 5.3 對象追蹤 40 5.4 RC與對象追蹤 42 5.5 GC安全點 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.3 VM線程到OS線程的映射 61 6.4 同步構件 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 中央控制點 75 6.7.3 鎖與非鎖 75 6.7.4 非阻塞之上的阻塞 76 6.8 回收器與修改器 77 6.9 線程局部數據 78 6.10 GC的線程暫停支持 81 6.10.1 GC安全點 81 6.10.2 GC安全區域 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 通過JNI API的本地到本地轉換 102 7.5.2 為什么在本地到本地轉換中使用JNI API 105 第8章 棧展開 107 8.1 為何需要棧展開 107 8.2 Java方法幀的棧展開 108 8.2.1 棧展開設計 108 8.2.2 棧展開實現 110 8.3 本地方法幀的棧展開 112 8.3.1 棧展開設計 112 8.3.2 Java到本地封裝設計 114 8.3.3 棧展開實現 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 對象引用訪問 127 9.3.2 對象句柄實現 129 9.3.3 GC安全性維護 132 9.3.4 對象體訪問 133 9.3.5 對象分配 135 9.4 在同步方法中支持垃圾回收 136 9.4.1 同步Java方法 136 9.4.2 同步本地方法 138 9.5 Java與本地代碼轉換中的GC支持 140 9.5.1 本地到Java 140 9.5.2 Java到本地 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.3 JNI API作為運行時輔助 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.1 VM保存的上下文 158 11.1.2 Linux中OS保存的上下文 158 11.1.3 Windows中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.1 VM組件 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.2 NOS大小 219 14.3.3 部分轉發NOS設計 221 14.3.4 半空間NOS設計 221 14.3.5 aged-mature NOS設計 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.4 Tasuki鎖 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.2 Intel的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.1 GC中HTM的機會 355 19.3.2 復制式回收 357 19.3.3 壓縮式回收 360 參考文獻 364 本書從一位虛擬機(VM)架構師的角度,以易于理解、層層深入的方式介紹了各種主題和算法,尤其是不同VM通用的主要技術。這些算法用圖示充分解釋,用便于理解的代碼片段實現,使得這些抽象概念對系統軟件工程師而言具像化并可編程。書中還包括一些同類文獻中較少涉及的主題,例如運行時輔助、棧展開和本地接口。本書集理論性與實踐性于一身,不僅結合了高層設計功能與底層實現,而且還結合了高級主題與商業解決方案,是VM設計和工程實踐方面的理想參考讀物。
|