《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》以流行的工業(yè)級Java虛擬機HotSpot為基礎,詳細剖析其基礎功能模塊的源碼,力求講清楚每個重要技術的原理和實現(xiàn)細節(jié),同時結合大量實例和圖示幫助讀者更好地理解所講內容。本書沒有介紹Java運行時的棧結構,以及解釋執(zhí)行與編譯執(zhí)行等知識點,這些內容在本書的姊妹篇《深入剖析Java虛擬機:源碼剖析與實例詳解(運行時卷)》一書中進行詳細的介紹。
《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》共13章,章節(jié)順序基本上是按照類的生命周期進行編排的。本書涵蓋的主要內容有HotSpot VM簡介、對象的二分模型、類的加載機制、類與常量池的解析、字段的解析、方法的解析、類的連接與初始化、運行時數(shù)據(jù)區(qū)、類對象的創(chuàng)建和初始化、Serial垃圾收集器、Serial Old垃圾收集器以及Java引用類型的實現(xiàn)原理等。
《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》主要面向想要深入學習和研究Java語言運行原理的人,尤其是正在從事或將來想要從事虛擬機開發(fā)的編程人員。另外,本書還非常適合Java求職人員閱讀,可以幫助他們系統(tǒng)掌握虛擬機的相關知識,從而游刃有余地應對相關公司招聘時的考查。
詳解Java虛擬機的類的生命周期和垃圾收集器等模塊的工作原理;
結合大量實例,全面、細致、深入地介紹HotSpot VM的運行原理;
詳細介紹如何將HotSpot VM的相關理論知識應用到開發(fā)和調優(yōu)實踐中;
幫助讀者深入理解HotSpot VM如何支持Java語言的諸多特性;
幫助讀者應對大型互聯(lián)網(wǎng)公司招聘時對虛擬機相關知識的深度考查。
相比已經(jīng)出版的Java虛擬機類圖書,本書有如下幾點不同:
(1)本書專注于工業(yè)級虛擬機HotSpot的具體源碼實現(xiàn),而非詳細解釋Java虛擬機的規(guī)范。
(2)本書對HotSpot VM的重點實現(xiàn)代碼做了深度剖析,通過理論與代碼剖析相結合的方式進行講解,而非通篇解釋理論。
(3)本書通過HotSpot VM的源碼實現(xiàn)展現(xiàn)虛擬機的底層理論,內容比較復雜,需要讀者考慮的問題較多,閱讀難度也較高,而非簡單介紹。
(4)本書只專注于HotSpot VM的源碼實現(xiàn),知識點精而深,而非大而全。
即便您已經(jīng)閱讀過其他Java虛擬機類圖書,通過閱讀本書,可以更加全面、深入地理解Java虛擬機底層運行原理,從而更加游刃有余地應對求職和實際開發(fā)。
為什么要寫這本書
Java是一門流行多年的高級編程語言,與其相關的就業(yè)崗位很多,但是近幾年卻出現(xiàn)了用人單位招不到合適的人,而大量Java程序員找不到工作的尷尬局面。究其根本原因是崗位對Java開發(fā)技術的要求高,不但要會應用,而且更要懂其內部的運行原理。對于想要深入研究Java技術的從業(yè)人員來說,虛擬機是繞不開的話題。目前國內市場上還鮮見一本全面、細致、深入剖析Java虛擬機源碼的書籍,這正是《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》要填補的市場空白。
《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》圍繞Java流行的HotSpot VM進行源碼的深度剖析,主要面向那些想要深入學習和研究Java語言運行原理的人!渡钊肫饰鯦ava虛擬機:源碼剖析與實例詳解(基礎卷)》對那些正在從事或將來想要從事虛擬機開發(fā)的編程人員也有極大的幫助。另外,對于Java求職人員來說,在參加大型互聯(lián)網(wǎng)公司的面試時,應對招聘企業(yè)對虛擬機相關知識的深度考查已成為不可回避的問題,《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》正好能提高他們對虛擬機理解的廣度和深度,可謂雪中送炭。
需要說明的是,HotSpot VM有上百萬行的代碼,這些代碼邏輯嚴密,細節(jié)眾多,要想講解清楚,需要較多的篇幅。為了讓讀者能夠更好地理解其中的要點,筆者決定用兩《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》的篇幅來介紹HotSpot VM的相關知識。《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》為《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》,后續(xù)還會推出《深入剖析Java虛擬機:源碼剖析與實例詳解(運行時卷)》,敬請各位讀者關注。筆者會在這兩《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》中對HoSpot VM的重點源代碼展開細致的講解,同時還會結合大量實例和圖示,幫助讀者更好地理解所學知識。
本書特色
1.內容豐富,講解詳細
《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》對對象的二分模型、類的加載機制、類與常量池、方法與變量、對象的創(chuàng)建和初始化、Serial和Serial Old垃圾收集器、Java引用類型等內容進行詳細解讀,幫讀者真正掌握HotSpot VM運行的每個細節(jié)。
2.原理分析與實例并重
《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》對HotSpot VM的各個基礎功能模塊的重點源代碼進行了詳細分析,并結合大量實例和圖示幫助讀者更好地理解所學內容。
3.分析工業(yè)級虛擬機的源碼實現(xiàn)
《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》分析的是一個工業(yè)級的Java虛擬機HotSpot,它是大部分Java開發(fā)人員運行Java項目時使用的虛擬機。對于Java從業(yè)人員來說,深入理解HotSpot VM的運行原理,可以幫助他們寫出更加高效的Java代碼,同時也能更好地排查Java性能瓶頸等一系列問題。
本書內容
《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》深入剖析HotSpot VM的源代碼實現(xiàn),每一章都會對重點源代碼的實現(xiàn)進行解讀。下面簡單介紹一下《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》中各章的內容。
第1章主要介紹本地編譯HotSpot VM的具體過程,以及如何使用圖形化工具對HotSpot VM的源代碼進行調試。
第2章介紹類的二分模型,其中表示Java類的Klass模型與表示Java對象的oop模型是HotSpot VM的基礎部分。
第3章介紹類的加載,重點介紹核心類和數(shù)組類的加載過程,以及類加載的雙親委派機制。
第4章對類及常量池進行解析,按照Class文件的格式從Class文件中解析出存儲的類及常量池信息,然后映射成HotSpot VM內部的表示形式。
第5章對字段進行解析,解析出Class文件中保存的字段信息后映射為HotSpot VM內部的表示形式,同時還要對實例字段進行布局。
第6章對方法進行解析,解析出Class文件中保存的方法信息后映射為HotSpot VM內部的表示形式,并初始化klassVtable與klassItable以更好地支持方法的運行。
第7章介紹類的連接和初始化過程。
第8章介紹HotSpot VM的內存劃分,重點介紹元空間和堆空間,如元空間的數(shù)據(jù)結構及其內存分配和釋放,以及堆的初始化和回收策略等。
第9章介紹Java對象的創(chuàng)建過程,重點介紹對象內存分配的具體過程。
第10章介紹垃圾回收的基礎知識,包括垃圾回收算法、支持分代垃圾回收的卡表和偏移表、支持垃圾回收的安全點。
第11章介紹用于回收年輕代的Serial垃圾收集器。
第12章介紹用于回收老年代的Serial Old垃圾收集器。
第13章介紹Java引用類型,包括引用類型的查找及不同類型引用對象的回收處理邏輯。
本書讀者對象
閱讀《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》需要讀者有一定的編程經(jīng)驗,尤其要對Java語言有一定的了解。具體而言,《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》主要適合以下讀者閱讀:
- 想深入學習Java語言特性的Java從業(yè)人員;
- 想全面、深入理解HotSpot VM原理的人員;
- 從事虛擬機開發(fā)的人員;
- 對大型工程的源代碼感興趣的人員,尤其是對C 語言工程實踐感興趣的人員。
本書閱讀建議
《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》的內容循序漸進,建議讀者按照章節(jié)的排列順序進行閱讀,同時在閱讀每一章的過程中對書中給出的實例進行實踐,以便更好地理解所講的內容。
HotSpot VM有上百萬行的源代碼,并且代碼的邏輯密度非常大。讀者閱讀相關的源代碼時,不要過分糾結于每個實現(xiàn)細節(jié),否則會陷入細節(jié)的汪洋大海中。《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》對HotSpot VM的重點源代碼進行了解讀,讀者可以參考書中對這些重點源代碼的講解進行學習和調試。
另外,要深入理解Java的運行原理,需要讀者對Java編譯器有所了解。想要全面、深入地學習Java編譯器的相關知識,推薦讀者閱讀筆者的拙作《深入解析Java編譯器:源碼剖析與實例詳解》一書。該書出版后得到了廣大Java技術愛好者的好評,是深入學習Java主流編譯器Javac運行原理的理想選擇。
本書配套資源
《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》涉及的HotSpot VM源代碼已經(jīng)開源,讀者可以通過多種途徑獲取。筆者推薦的下載網(wǎng)址為https://download.java.net/openjdk/jdk8。
讀者反饋
由于筆者水平所限,書中可能還存在一些疏漏,敬請讀者指正,筆者會及時進行調整和修改。聯(lián)系郵箱hzbook2017@163.com。
致謝
《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》的寫作得到很多朋友和同事的幫助與支持,筆者在此表示由衷的感謝!
感謝歐振旭編輯在《深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)》出版過程中給予筆者的大力支持與幫助!
后感謝家人對我的理解與支持,在我遇到挫折和問題時,家人堅定地支持著我。愛你們!
……
馬智 有多年的Java開發(fā)經(jīng)驗,先后在掌游天下和集團任軟件研發(fā)工程師。對編程語言的底層實現(xiàn)有濃厚的興趣,深入研究過OpenJDK的源碼實現(xiàn)。著有《深入解析Java編譯器:源碼剖析與實例詳解》一書,頗受讀者好評。
前言
第1章 認識HotSpot VM 1
1.1 初識JVM 1
1.2 編譯OpenJDK 8 3
1.2.1 準備編譯環(huán)境 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的定義與創(chuàng)建 55
2.3.2 句柄Handle的釋放 57
第3章 類的加載 62
3.1 類加載器 62
3.1.1 引導類加載器/啟動類加載器 62
3.1.2 擴展類加載器 64
3.1.3 應用類加載器/系統(tǒng)類加載器 65
3.1.4 構造類加載器實例 65
3.1.5 類的雙親委派機制 68
3.2 預加載類 83
3.2.1 核心類的預加載 83
3.2.2 數(shù)組的預加載 87
3.3 Java主類的裝載 88
3.4 觸發(fā)類的裝載 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 創(chuàng)建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 靜態(tài)字段內存塊的偏移量 148
5.3.2 非靜態(tài)字段內存塊的偏移量 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()函數(shù)解析方法 178
6.2.1 創(chuàng)建Method與ConstMethod實例 182
6.2.2 保存方法解析信息 187
6.3 klassVtable虛函數(shù)表 187
6.3.1 klassVtable類 188
6.3.2 計算vtable的大小 189
6.3.3 vtable的初始化 200
6.4 klassItable虛函數(shù)表 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 重寫字節(jié)碼指令 234
7.3.3 創(chuàng)建常量池緩存 238
7.4 方法的連接 244
7.5 類的初始化 246
第8章 運行時數(shù)據(jù)區(qū) 250
8.1 HotSpot VM的內存劃分 250
8.2 元空間 252
8.2.1 元空間的數(shù)據(jù)結構 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章 類對象的創(chuàng)建 299
9.1 對象的創(chuàng)建 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 阻塞線程和狀態(tài)切換線程進入安全點 376
10.3.3 解釋線程進入安全點 379
10.3.4 編譯線程進入安全點 383
10.3.5 執(zhí)行本地代碼線程進入安全點 385
第11章 Serial垃圾收集器 388
11.1 觸發(fā)YGC 388
11.2 年輕代的垃圾回收 389
11.3 標記普通的根對象 403
11.4 標記老年代引用的對象 415
11.5 遞歸標記活躍對象并復制 422
第12章 Serial Old垃圾收集器 428
12.1 觸發(fā)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
……