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