深入剖析 Java 虛擬機:源碼剖析與實例詳解 (基礎卷)

馬智

  • 出版商: 機械工業
  • 出版日期: 2021-08-19
  • 定價: $894
  • 售價: 8.5$760
  • 語言: 簡體中文
  • 頁數: 512
  • 裝訂: 平裝
  • ISBN: 7111689895
  • ISBN-13: 9787111689898
  • 相關分類: Java 程式語言
  • 立即出貨

買這商品的人也買了...

商品描述

本書以工業級虛擬機HotSpot的源代碼分析為基礎,詳細介紹了對象的二分模型、類的加載機制、類及常量池的解析、
方法及變量解析、對象的創建和初始化、Serial和Serial Old垃圾收集器、Java引用類型等的實現原理,
同時對重點源代碼的實現進行了詳細解讀,讓讀者真正掌握HotSpot虛擬機運行的每個細節。
本書共13章,章節的前後順序基本都是按類的生命週期進行介紹。
本書對於HotSpot VM的基礎功能模塊進行了源碼剖析,
力求交待清楚每個重要知識點的實現細節和背後的運行原理,
同時還會用大量的實例和配圖幫助讀者更好的理解。

作者簡介

馬智 

結合大量實例,全面、細緻、深入地介紹HotSpot VM的運行原理;
詳細介紹如何將HotSpot VM的相關理論知識應用到開發和調優實踐中;
幫助讀者深入理解HotSpot VM如何支持Java語言的諸多特性;
幫助讀者應對大型互聯網公司招聘時對虛擬機相關知識的深度考查。

目錄大綱

前言
第1章 認識HotSpot VM 1
1.1 初識JVM 1
1.2 編譯OpenJDK 8 3
1.2.1 準備編譯環境 3
1.2.2 下載源代碼 3
1.2.3 編譯源代碼 4
1.2.4 通過GDB調試源代碼 6
1.2.5 通過Eclipse調試源代碼 7
1.3 HotSpot VM源代碼結構 9
1.4 啟動HotSpot VM 11

第2章 二分模型 17
2.1 Java類的表示——Klass 17
2.1.1 Klass類 18
2.1.2 InstanceKlass類 26
2.1.3 InstanceKlass類的子類 29
2.1.4 ArrayKlass類 34
2.1.5 TypeArrayKlass類 35
2.1.6 ObjArrayKlass類 40
2.2 Java對象的表示——oop 46
2.2.1 oopDesc類 46
2.2.2 markOopDesc類 48
2.2.3 instanceOopDesc類 49
2.2.4 arrayOopDesc類 51
2.2.5 arrayOopDesc類的子類 51
2.3 操作句柄——Handle 54
2.3.1 句柄Handle的定義與創建 55
2.3.2 句柄Handle的釋放 57

第3章 類的加載 62
3.1 類加載器 62
3.1.1 引導類加載器/啟動類加載器 62
3.1.2 擴展類加載器 64
3.1.3 應用類加載器/系統類加載器 65
3.1.4 構造類加載器實例 65
3.1.5 類的雙親委派機制 68
3.2 預加載類 83
3.2.1 核心類的預加載 83
3.2.2 數組的預加載 87
3.3 Java主類的裝載 88
3.4 觸發類的裝載 94

第4章 類與常量池的解析 97
4.1 類的解析 97
4.1.1 Class文件格式 97
4.1.2 ClassFileParser類簡介 98
4.1.3 ClassFileStream類簡介 99
4.1.4 解析類文件 102
4.1.5 保存解析結果 109
4.2 常量池的解析 116
4.2.1 ConstantPool類 117
4.2.2 創建ConstantPool實例 117
4.2.3 解析常量池項 122

第5章 字段的解析 136
5.1 字段的解析基礎 136
5.1.1 FieldAllocationCount與FieldAllocationType類 136
5.1.2 為字段分配內存空間 139
5.1.3 獲取字段信息 141
5.2 偽共享 145
5.3 字段的內存佈局 148
5.3.1 靜態字段內存塊的偏移量 148
5.3.2 非靜態字段內存塊的偏移量 149
5.3.3 計算每個字段的偏移量 154
5.3.4 @Contended字段的偏移量 156
5.4 字段的注入 158
5.5 對像類型字段的遍歷 165

第6章 方法的解析 174
6.1 Method與ConstMethod類 174
6.1.1 Method類 174
6.1.2 ConstMethod類 177
6.2 調用parse_methods()函數解析方法 178
6.2.1 創建Method與ConstMethod實例 182
6.2.2 保存方法解析信息 187
6.3 klassVtable虛函數表 187
6.3.1 klassVtable類 188
6.3.2 計算vtable的大小 189
6.3.3 vtable的初始化 200
6.4 klassItable虛函數表 209
6.4.1 klassItable類 209
6.4.2 計算itable的大小 211
6.4.3 itable的初始化 213

第7章 類的連接與初始化 220
7.1 類的連接 220
7.2 類的驗證 224
7.3 類的重寫 227
7.3.1 生成常量池緩存項索引 228
7.3.2 重寫字節碼指令 234
7.3.3 創建常量池緩存 238
7.4 方法的連接 244
7.5 類的初始化 246

第8章 運行時數據區 250
8.1 HotSpot VM的內存劃分 250
8.2 元空間 252
8.2.1 元空間的數據結構 253
8.2.2 內存塊的管理 256
8.2.3 內存分配 258
8.2.4 內存回收 262
8.3 堆空間 267
8.3.1 CollectedHeap、Generation與Space類 268
8.3.2 Java堆的回收策略 277
8.3.3 Java堆的初始化 288

第9章 類對象的創建 299
9.1 對象的創建 299
9.2 對象的內存分配 311
9.2.1 在TLAB中分配內存 311
9.2.2 在堆中分配內存 322
9.2.3 添加對象偏移表記錄 335

第10章 垃圾回收 344
10.1 分代垃圾回收 344
10.1.1 Serial和Serial Old垃圾收集器 344
10.1.2 複製算法和“標記-整理”算法 346
10.1.3 卡表 352
10.2 垃圾回收線程 358
10.3 安全點 370
10.3.1 關於安全點 370
10.3.2 阻塞線程和狀態切換線程進入安全點 376
10.3.3 解釋線程進入安全點 379
10.3.4 編譯線程進入安全點 383
10.3.5 執行本地代碼線程進入安全點 385

第11章 Serial垃圾收集器 388
11.1 觸發YGC 388
11.2 年輕代的垃圾回收 389
11.3 標記普通的根對象 403
11.4 標記老年代引用的對象 415
11.5 遞歸標記活躍對象並複制 422

第12章 Serial Old垃圾收集器 428
12.1 觸發FGC 428
12.2 標記活躍對象 431
12.3 計算活躍對象的地址 440
12.4 更新對象的引用地址 451
12.5 移動所有活躍對象 457
12.6 更新偏移表與卡表 460

第13章 Java引用類型 463
13.1 Java引用類型簡介 463
13.2 查找引用類型 469
13.3 軟引用 481
13.4 弱引用 490
13.5 虛引用 492
13.6 最終引用 495