周志明 著
適讀人群 :
【本書(shū)示例源代碼免費(fèi)提供下載,關(guān)注“華章計(jì)算機(jī)”回復(fù)“虛擬機(jī)”直接獲取源代碼下載地址】
(1)涵蓋絕大部分互聯(lián)網(wǎng)大廠面試知識(shí)點(diǎn)!助你順利進(jìn)大廠!
(2)根據(jù)JDK12和JDK 13 EA版本全面更新,新增內(nèi)容近50%,并對(duì)第2版中含糊、瑕疵和錯(cuò)誤內(nèi)容進(jìn)行了修正。
(3)計(jì)算機(jī)圖書(shū)領(lǐng)域的豐碑,累計(jì)印刷超40次,銷(xiāo)量超過(guò)30萬(wàn)冊(cè),兩家網(wǎng)店評(píng)論數(shù)量超過(guò)90000條,內(nèi)容近乎零差評(píng)。
(4)從Java技術(shù)體系、自動(dòng)內(nèi)存管理、虛擬機(jī)執(zhí)行子系統(tǒng)、程序編譯與代碼優(yōu)化、高效并發(fā)5個(gè)維度全面分析JVM。
(5)全書(shū)以實(shí)戰(zhàn)為導(dǎo)向,通過(guò)大量與實(shí)際生產(chǎn)環(huán)境相結(jié)合的案例分析和展示了解決各種Java技術(shù)難題的方案和技巧。
(6)來(lái)自阿里、騰訊、微軟、百度、滴滴、易寶支付、同盾科技、達(dá)觀數(shù)據(jù)、易觀國(guó)際、蘑菇街的10位專家高度評(píng)價(jià)并強(qiáng)烈推薦。
(7)這本書(shū)值得所有Java技術(shù)人員讀3遍,值得Java技術(shù)人員讀3遍,值得讀3遍!
這是一部從工作原理和工程實(shí)踐兩個(gè)維度深入剖析JVM的著作,是計(jì)算機(jī)領(lǐng)域公認(rèn)的經(jīng)典,繁體版在中國(guó)臺(tái)灣地區(qū)也頗受歡迎。
自2011年上市以來(lái),累計(jì)印刷超40次,銷(xiāo)量超過(guò)30萬(wàn)冊(cè),兩家主要網(wǎng)絡(luò)書(shū)店的評(píng)論近90000條,內(nèi)容上近乎零差評(píng),是原創(chuàng)計(jì)算機(jī)圖書(shū)領(lǐng)域不可逾越的豐碑。
第3版在第2版的基礎(chǔ)上做了重大修訂,內(nèi)容更豐富、實(shí)戰(zhàn)性更強(qiáng):根據(jù)新版JDK對(duì)內(nèi)容進(jìn)行了全方位的修訂和升級(jí),圍繞新技術(shù)和生產(chǎn)實(shí)踐新增逾10萬(wàn)字,包含近50%的全新內(nèi)容,并對(duì)第2版中含糊、瑕疵和錯(cuò)誤內(nèi)容進(jìn)行了修正。涵蓋互聯(lián)網(wǎng)大廠面試重要知識(shí)點(diǎn)!
全書(shū)一共13章,分為五大部分:
●第①部分(第1章)走近Java
系統(tǒng)介紹了Java的技術(shù)體系、發(fā)展歷程、虛擬機(jī)家族,以及動(dòng)手編譯JDK,了解這部分內(nèi)容能對(duì)學(xué)習(xí)JVM提供良好的指引。
●第②部分(第2~5章)自動(dòng)內(nèi)存管理
詳細(xì)講解了Java的內(nèi)存區(qū)域與內(nèi)存溢出、垃圾收集器與內(nèi)存分配策略、虛擬機(jī)性能監(jiān)控與故障排除等與自動(dòng)內(nèi)存管理相關(guān)的內(nèi)容,以及10余個(gè)經(jīng)典的性能優(yōu)化案例和優(yōu)化方法;
●第③部分(第6~9章)虛擬機(jī)執(zhí)行子系統(tǒng)
深入分析了虛擬機(jī)執(zhí)行子系統(tǒng),包括類(lèi)文件結(jié)構(gòu)、虛擬機(jī)類(lèi)加載機(jī)制、虛擬機(jī)字節(jié)碼執(zhí)行引擎,以及多個(gè)類(lèi)加載及其執(zhí)行子系統(tǒng)的實(shí)戰(zhàn)案例;
●第④部分(第10~11章)程序編譯與代碼優(yōu)化
詳細(xì)講解了程序的前、后端編譯與優(yōu)化,包括前端的易用性優(yōu)化措施,如泛型、主動(dòng)裝箱拆箱、條件編譯等的內(nèi)容的深入分析;以及后端的性能優(yōu)化措施,如虛擬機(jī)的熱點(diǎn)探測(cè)方法、HotSpot 的即時(shí)編譯器、提前編譯器,以及各種常見(jiàn)的編譯期優(yōu)化技術(shù);
●第⑤部分(第12~13章)高效并發(fā)
主要講解了Java實(shí)現(xiàn)高并發(fā)的原理,包括Java的內(nèi)存模型、線程與協(xié)程,以及線程安全和鎖優(yōu)化。
全書(shū)以實(shí)戰(zhàn)為導(dǎo)向,通過(guò)大量與實(shí)際生產(chǎn)環(huán)境相結(jié)合的案例分析和展示了解決各種Java技術(shù)難題的方案和技巧。
周志明(博士)
資深Java技術(shù)專家-機(jī)器學(xué)習(xí)技術(shù)專家和企業(yè)級(jí)開(kāi)發(fā)技術(shù)專家,現(xiàn)任遠(yuǎn)光軟件研究院院長(zhǎng)。
開(kāi)源技術(shù)的積極倡導(dǎo)者和推動(dòng)者,對(duì)計(jì)算機(jī)科學(xué)相關(guān)的多個(gè)領(lǐng)域都有深刻的見(jiàn)解,尤其是人工智能-Java技術(shù)和敏捷開(kāi)發(fā)等,對(duì)虛擬機(jī)技術(shù)有非常深入的研究。
撰寫(xiě)了《深入理解Java虛擬機(jī)》《深入理解OSGi》《智慧的疆界》等多本著作,翻譯了《Java虛擬機(jī)規(guī)范》等著作。其中《深入理解Java虛擬機(jī)》已累計(jì)印刷逾40次,總銷(xiāo)超過(guò)30萬(wàn)冊(cè),成為原創(chuàng)計(jì)算機(jī)專業(yè)圖書(shū)領(lǐng)域難以逾越的豐碑。
●該書(shū)是國(guó)內(nèi)近10年少見(jiàn)的原創(chuàng)計(jì)算機(jī)著作,它幫助國(guó)內(nèi)數(shù)十萬(wàn)Java開(kāi)發(fā)工程師和架構(gòu)師加深了對(duì)JVM的認(rèn)知,提升了Java水平,不可多得。
——陳斌 易寶支付 CTO
●當(dāng)年看到本書(shū)的第1版時(shí)如獲至寶,深入淺出,原理和實(shí)踐都講得很透徹,反復(fù)讀了很多遍,讓我對(duì)Java有了深入的了解。第3版在內(nèi)容上有很多更新,強(qiáng)烈推薦給所有技術(shù)從業(yè)者。
——張新波 同盾科技聯(lián)合創(chuàng)始人兼副總裁
●本書(shū)是講解JVM原理的經(jīng)典著作,詳實(shí)地介紹了內(nèi)存管理、多線程、編譯過(guò)程、執(zhí)行子系統(tǒng)、高并發(fā)優(yōu)化等關(guān)鍵技術(shù),第3版中新增了大量新的Java技術(shù),值得再仔細(xì)閱讀。
——陳運(yùn)文 國(guó)家萬(wàn)人計(jì)劃專家、達(dá)觀數(shù)據(jù)CEO
●JVM是Java的核心和基礎(chǔ),深入理解它,不僅有助于提升Java程序的性能,而且能幫助我們更深入地理解底層語(yǔ)言的運(yùn)行機(jī)制,希望本書(shū)能幫助更多Java工程師提升功力。
——郭煒 易觀國(guó)際CTO
●本書(shū)對(duì)Java內(nèi)核體系進(jìn)行了系統(tǒng)梳理,詳細(xì)地講解了Java中的關(guān)鍵組件和體系,如Java的內(nèi)存管理、JVM系統(tǒng)的全局體系、性能調(diào)優(yōu)、高并發(fā)等,讓讀者可以非常全面地了解JVM的運(yùn)行機(jī)制和調(diào)優(yōu)原理。
——羅李 滴滴大數(shù)據(jù)架構(gòu)部負(fù)責(zé)人/Apache Alluxio PMC&Committer
●只有掌握J(rèn)VM的原理,才能夠在高并發(fā)、大容量和低延時(shí)的極端場(chǎng)景下做好架構(gòu)和編碼,這對(duì)程序員的要求極為嚴(yán)苛,本書(shū)為廣大Java程序員和架構(gòu)師提供了非常棒的指導(dǎo)。
——趙成 蘑菇街技術(shù)總監(jiān)
●本書(shū)值得所有Java工程師仔細(xì)研讀,在它的基礎(chǔ)上再去深入挖掘,必定能對(duì)Java開(kāi)發(fā)和相關(guān)系統(tǒng)的設(shè)計(jì)有真正的理解,完成從應(yīng)用開(kāi)發(fā)到系統(tǒng)設(shè)計(jì)的關(guān)鍵一步。
——張力柯 騰訊游戲Turing Lab副總監(jiān)
●深入理解JVM,對(duì)于提升自身的編碼素養(yǎng)至關(guān)重要。這本經(jīng)典著作為我們系統(tǒng)地理解JVM指明了方向,在銷(xiāo)量和口碑方面,同類(lèi)書(shū)只能望其項(xiàng)背!
——曹洪偉 百度DuerOS布道師
●JVM是Java技術(shù)生態(tài)的基石,深入了解JVM是Java程序員進(jìn)階的必修課。本書(shū)自第1版上市以來(lái),就獲得了極好的口碑,已經(jīng)成為中國(guó)Java程序員必不可少的案頭書(shū)。
——陳耿 微軟全球黑帶技術(shù)專家/《開(kāi)源容器云OpenShift》《深入淺出Serverless》作者
●這本書(shū)用平實(shí)的語(yǔ)言講解了JVM的關(guān)鍵功能模塊,包括自動(dòng)內(nèi)存管理、虛擬機(jī)執(zhí)行系統(tǒng)、字節(jié)碼優(yōu)化以及并發(fā)原理等,都是我們?cè)谑褂肑ava的過(guò)程中會(huì)經(jīng)常用到的,很值得花時(shí)間深入研究和學(xué)習(xí)。
——沈詢 阿里資深技術(shù)專家
【第一部分 走近Java】
●第1章 走近Java 2
1.1 概述 2
1.2 Java技術(shù)體系 3
1.3 Java發(fā)展史 4
1.4 Java虛擬機(jī)家族 12
1.4.1 虛擬機(jī)始祖:Sun Classic/Exact VM 12
1.4.2 武林盟主:HotSpot VM 13
1.4.3 小家碧玉:Mobile/Embedded VM 14
1.4.4 天下第二:BEA JRockit/IBM J9 VM 15
1.4.5 軟硬合璧:BEA Liquid VM/Azul VM 16
1.4.6 挑戰(zhàn)者:Apache Harmony/Google Android Dalvik VM 17
1.4.7 沒(méi)有成功,但并非失敗:Microsoft JVM及其他 18
1.4.8 百家爭(zhēng)鳴 19
1.5 展望Java技術(shù)的未來(lái) 21
1.5.1 無(wú)語(yǔ)言傾向 21
1.5.2 新一代即時(shí)編譯器 23
1.5.3 向Native邁進(jìn) 24
1.5.4 靈活的胖子 26
1.5.5 語(yǔ)言語(yǔ)法持續(xù)增強(qiáng) 27
1.6 實(shí)戰(zhàn):自己編譯JDK 29
1.6.1 獲取源碼 29
1.6.2 系統(tǒng)需求 31
1.6.3 構(gòu)建編譯環(huán)境 33
1.6.4 進(jìn)行編譯 34
1.6.5 在IDE工具中進(jìn)行源碼調(diào)試 36
1.7 本章小結(jié) 39
【第二部分 自動(dòng)內(nèi)存管理】
●第2章 Java內(nèi)存區(qū)域與內(nèi)存溢出異常 42
2.1 概述 42
2.2 運(yùn)行時(shí)數(shù)據(jù)區(qū)域 42
2.2.1 程序計(jì)數(shù)器 43
2.2.2 Java虛擬機(jī)棧 43
2.2.3 本地方法棧 44
2.2.4 Java堆 44
2.2.5 方法區(qū) 46
2.2.6 運(yùn)行時(shí)常量池 47
2.2.7 直接內(nèi)存 47
2.3 HotSpot虛擬機(jī)對(duì)象探秘 48
2.3.1 對(duì)象的創(chuàng)建 48
2.3.2 對(duì)象的內(nèi)存布局 51
2.3.3 對(duì)象的訪問(wèn)定位 52
2.4 實(shí)戰(zhàn):OutOfMemoryError異常 53
2.4.1 Java堆溢出 54
2.4.2 虛擬機(jī)棧和本地方法棧溢出 56
2.4.3 方法區(qū)和運(yùn)行時(shí)常量池溢出 61
2.4.4 本機(jī)直接內(nèi)存溢出 65
2.5 本章小結(jié) 66
●第3章 垃圾收集器與內(nèi)存分配策略 67
3.1 概述 67
3.2 對(duì)象已死? 68
3.2.1 引用計(jì)數(shù)算法 68
3.2.2 可達(dá)性分析算法 70
3.2.3 再談引用 71
3.2.4 生存還是死亡? 72
3.2.5 回收方法區(qū) 74
3.3 垃圾收集算法 75
3.3.1 分代收集理論 75
3.3.2 標(biāo)記-清除算法 77
3.3.3 標(biāo)記-復(fù)制算法 78
3.3.4 標(biāo)記-整理算法 79
3.4 HotSpot的算法細(xì)節(jié)實(shí)現(xiàn) 81
3.4.1 根節(jié)點(diǎn)枚舉 81
3.4.2 安全點(diǎn) 82
3.4.3 安全區(qū)域 83
3.4.4 記憶集與卡表 84
3.4.5 寫(xiě)屏障 85
3.4.6 并發(fā)的可達(dá)性分析 87
3.5 經(jīng)典垃圾收集器 89
3.5.1 Serial收集器 90
3.5.2 ParNew收集器 92
3.5.3 Parallel Scavenge收集器 93
3.5.4 Serial Old收集器 94
3.5.5 Parallel Old收集器 95
3.5.6 CMS收集器 96
3.5.7 Garbage First收集器 98
3.6 低延遲垃圾收集器 104
3.6.1 Shenandoah收集器 105
3.6.2 ZGC收集器 112
3.7 選擇合適的垃圾收集器 121
3.7.1 Epsilon收集器 121
3.7.2 收集器的權(quán)衡 121
3.7.3 虛擬機(jī)及垃圾收集器日志 122
3.7.4 垃圾收集器參數(shù)總結(jié) 127
3.8 實(shí)戰(zhàn):內(nèi)存分配與回收策略 129
3.8.1 對(duì)象優(yōu)先在Eden分配 130
3.8.2 大對(duì)象直接進(jìn)入老年代 131
3.8.3 長(zhǎng)期存活的對(duì)象將進(jìn)入老年代 132
3.8.4 動(dòng)態(tài)對(duì)象年齡判定 134
3.8.5 空間分配擔(dān)保 135
3.9 本章小結(jié) 137
●第4章 虛擬機(jī)性能監(jiān)控-故障處理工具 138
4.1 概述 138
4.2 基礎(chǔ)故障處理工具 138
4.2.1 jps:虛擬機(jī)進(jìn)程狀況工具 141
4.2.2 jstat:虛擬機(jī)統(tǒng)計(jì)信息監(jiān)視工具 142
4.2.3 jinfo:Java配置信息工具 143
4.2.4 jmap:Java內(nèi)存映像工具 144
4.2.5 jhat:虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具 145
4.2.6 jstack:Java堆棧跟蹤工具 146
4.2.7 基礎(chǔ)工具總結(jié) 148
4.3 可視化故障處理工具 151
4.3.1 JHSDB:基于服務(wù)性代理的調(diào)試工具 152
4.3.2 JConsole:Java監(jiān)視與管理控制臺(tái) 157
4.3.3 VisualVM:多合-故障處理工具 164
4.3.4 Java Mission Control:可持續(xù)在線的監(jiān)控工具 171
4.4 HotSpot虛擬機(jī)插件及工具 175
4.5 本章小結(jié) 180
●第5章 調(diào)優(yōu)案例分析與實(shí)戰(zhàn) 181
5.1 概述 181
5.2 案例分析 181
5.2.1 大內(nèi)存硬件上的程序部署策略 182
5.2.2 集群間同步導(dǎo)致的內(nèi)存溢出 184
5.2.3 堆外內(nèi)存導(dǎo)致的溢出錯(cuò)誤 185
5.2.4 外部命令導(dǎo)致系統(tǒng)緩慢 187
5.2.5 服務(wù)器虛擬機(jī)進(jìn)程崩潰 187
5.2.6 不恰當(dāng)數(shù)據(jù)結(jié)構(gòu)導(dǎo)致內(nèi)存占用過(guò)大 188
5.2.7 由Windows虛擬內(nèi)存導(dǎo)致的長(zhǎng)時(shí)間停頓 189
5.2.8 由安全點(diǎn)導(dǎo)致長(zhǎng)時(shí)間停頓 190
5.3 實(shí)戰(zhàn):Eclipse運(yùn)行速度調(diào)優(yōu) 192
5.3.1 調(diào)優(yōu)前的程序運(yùn)行狀態(tài) 193
5.3.2 升級(jí)JDK版本的性能變化及兼容問(wèn)題 196
5.3.3 編譯時(shí)間和類(lèi)加載時(shí)間的優(yōu)化 200
5.3.4 調(diào)整內(nèi)存設(shè)置控制垃圾收集頻率 203
5.3.5 選擇收集器降低延遲 206
5.4 本章小結(jié) 209
【第三部分 虛擬機(jī)執(zhí)行子系統(tǒng)】
●第6章 類(lèi)文件結(jié)構(gòu) 212
6.1 概述 212
6.2 無(wú)關(guān)性的基石 212
6.3 Class類(lèi)文件的結(jié)構(gòu) 214
6.3.1 魔數(shù)與Class文件的版本 215
6.3.2 常量池 218
6.3.3 訪問(wèn)標(biāo)志 224
6.3.4 類(lèi)索引-父類(lèi)索引與接口索引集合 225
6.3.5 字段表集合 226
6.3.6 方法表集合 229
6.3.7 屬性表集合 230
6.4 字節(jié)碼指令簡(jiǎn)介 251
6.4.1 字節(jié)碼與數(shù)據(jù)類(lèi)型 251
6.4.2 加載和存儲(chǔ)指令 253
6.4.3 運(yùn)算指令 254
6.4.4 類(lèi)型轉(zhuǎn)換指令 255
6.4.5 對(duì)象創(chuàng)建與訪問(wèn)指令 256
6.4.6 操作數(shù)棧管理指令 256
6.4.7 控制轉(zhuǎn)移指令 257
6.4.8 方法調(diào)用和返回指令 257
6.4.9 異常處理指令 258
6.4.10 同步指令 258
6.5 公有設(shè)計(jì),私有實(shí)現(xiàn) 259
6.6 Class文件結(jié)構(gòu)的發(fā)展 260
6.7 本章小結(jié) 261
第7章 虛擬機(jī)類(lèi)加載機(jī)制 262
7.1 概述 262
7.2 類(lèi)加載的時(shí)機(jī) 263
7.3 類(lèi)加載的過(guò)程 267
7.3.1 加載 267
7.3.2 驗(yàn)證 268
7.3.3 準(zhǔn)備 271
7.3.4 解析 272
7.3.5 初始化 277
7.4 類(lèi)加載器 279
7.4.1 類(lèi)與類(lèi)加載器 280
7.4.2 雙親委派模型 281
7.4.3 破壞雙親委派模型 285
7.5 Java模塊化系統(tǒng) 287
7.5.1 模塊的兼容性 288
7.5.2 模塊化下的類(lèi)加載器 290
7.6 本章小結(jié) 292
第8章 虛擬機(jī)字節(jié)碼執(zhí)行引擎 293
8.1 概述 293
8.2 運(yùn)行時(shí)棧幀結(jié)構(gòu) 294
8.2.1 局部變量表 294
8.2.2 操作數(shù)棧 299
8.2.3 動(dòng)態(tài)連接 300
8.2.4 方法返回地址 300
8.2.5 附加信息 301
8.3 方法調(diào)用 301
8.3.1 解析 301
8.3.2 分派 303
8.4 動(dòng)態(tài)類(lèi)型語(yǔ)言支持 315
8.4.1 動(dòng)態(tài)類(lèi)型語(yǔ)言 316
8.4.2 Java與動(dòng)態(tài)類(lèi)型 317
8.4.3 java.lang.invoke包 318
8.4.4 invokedynamic指令 321
8.4.5 實(shí)戰(zhàn):掌控方法分派規(guī)則 324
8.5 基于棧的字節(jié)碼解釋執(zhí)行引擎 326
8.5.1 解釋執(zhí)行 327
8.5.2 基于棧的指令集與基于寄存器的指令集 328
8.5.3 基于棧的解釋器執(zhí)行過(guò)程 329
8.6 本章小結(jié) 334
第9章 類(lèi)加載及執(zhí)行子系統(tǒng)的案例與實(shí)戰(zhàn) 335
9.1 概述 335
9.2 案例分析 335
9.2.1 Tomcat:正統(tǒng)的類(lèi)加載器架構(gòu) 335
9.2.2 OSGi:靈活的類(lèi)加載器架構(gòu) 338
9.2.3 字節(jié)碼生成技術(shù)與動(dòng)態(tài)代理的實(shí)現(xiàn) 341
9.2.4 Backport工具:Java的時(shí)光機(jī)器 345
9.3 實(shí)戰(zhàn):自己動(dòng)手實(shí)現(xiàn)遠(yuǎn)程執(zhí)行功能 348
9.3.1 目標(biāo) 348
9.3.2 思路 349
9.3.3 實(shí)現(xiàn) 350
9.3.4 驗(yàn)證 355
9.4 本章小結(jié) 356
【第四部分 程序編譯與代碼優(yōu)化】
●第10章 前端編譯與優(yōu)化 358
10.1 概述 358
10.2 Javac編譯器 359
10.2.1 Javac的源碼與調(diào)試 359
10.2.2 解析與填充符號(hào)表 362
10.2.3 注解處理器 363
10.2.4 語(yǔ)義分析與字節(jié)碼生成 364
10.3 Java語(yǔ)法糖的味道 367
10.3.1 泛型 367
10.3.2 自動(dòng)裝箱-拆箱與遍歷循環(huán) 375
10.3.3 條件編譯 377
10.4 實(shí)戰(zhàn):插入式注解處理器 378
10.4.1 實(shí)戰(zhàn)目標(biāo) 379
10.4.2 代碼實(shí)現(xiàn) 379
10.4.3 運(yùn)行與測(cè)試 385
10.4.4 其他應(yīng)用案例 386
10.5 本章小結(jié) 386
●第11章 后端編譯與優(yōu)化 388
11.1 概述 388
11.2 即時(shí)編譯器 389
11.2.1 解釋器與編譯器 389
11.2.2 編譯對(duì)象與觸發(fā)條件 392
11.2.3 編譯過(guò)程 397
11.2.4 實(shí)戰(zhàn):查看及分析即時(shí)編譯結(jié)果 398
11.3 提前編譯器 404
11.3.1 提前編譯的優(yōu)劣得失 405
11.3.2 實(shí)戰(zhàn):Jaotc的提前編譯 408
11.4 編譯器優(yōu)化技術(shù) 411
11.4.1 優(yōu)化技術(shù)概覽 411
11.4.2 方法內(nèi)聯(lián) 415
11.4.3 逃逸分析 417
11.4.4 公共子表達(dá)式消除 420
11.4.5 數(shù)組邊界檢查消除 421
11.5 實(shí)戰(zhàn):深入理解Graal編譯器 423
11.5.1 歷史背景 423
11.5.2 構(gòu)建編譯調(diào)試環(huán)境 424
11.5.3 JVMCI編譯器接口 426
11.5.4 代碼中間表示 429
11.5.5 代碼優(yōu)化與生成 432
11.6 本章小結(jié) 436
【第五部分 高效并發(fā)】
●第12章 Java內(nèi)存模型與線程 438
12.1 概述 438
12.2 硬件的效率與一致性 439
12.3 Java內(nèi)存模型 440
12.3.1 主內(nèi)存與工作內(nèi)存 441
12.3.2 內(nèi)存間交互操作 442
12.3.3 對(duì)于volatile型變量的特殊規(guī)則 444
12.3.4 針對(duì)long和double型變量的特殊規(guī)則 450
12.3.5 原子性-可見(jiàn)性與有序性 450
12.3.6 先行發(fā)生原則 452
12.4 Java與線程 455
12.4.1 線程的實(shí)現(xiàn) 455
12.4.2 Java線程調(diào)度 458
12.4.3 狀態(tài)轉(zhuǎn)換 460
12.5 Java與協(xié)程 461
12.5.1 內(nèi)核線程的局限 461
12.5.2 協(xié)程的復(fù)蘇 462
12.5.3 Java的解決方案 464
12.6 本章小結(jié) 465
●第13章 線程安全與鎖優(yōu)化 466
13.1 概述 466
13.2 線程安全 466
13.2.1 Java語(yǔ)言中的線程安全 467
13.2.2 線程安全的實(shí)現(xiàn)方法 471
13.3 鎖優(yōu)化 479
13.3.1 自旋鎖與自適應(yīng)自旋 479
13.3.2 鎖消除 480
13.3.3 鎖粗化 481
13.3.4 輕量級(jí)鎖 481
13.3.5 偏向鎖 483
13.4 本章小結(jié) 485
附錄A 在Windows系統(tǒng)下編譯OpenJDK 6 486
附錄B 展望Java技術(shù)的未來(lái)(2013年版) 493
附錄C 虛擬機(jī)字節(jié)碼指令表 499
附錄D 對(duì)象查詢語(yǔ)言(OQL)簡(jiǎn)介 506
附錄E JDK歷史版本軌跡 512
【前 言】
Java是目前用戶最多-使用范圍最廣的軟件開(kāi)發(fā)技術(shù),Java的技術(shù)體系主要由支撐Java程序運(yùn)行的虛擬機(jī)-提供各開(kāi)發(fā)領(lǐng)域接口支持的Java類(lèi)庫(kù)-Java編程語(yǔ)言及許許多多的第三方Java框架(如Spring-MyBatis等)構(gòu)成。在國(guó)內(nèi),有關(guān)Java類(lèi)庫(kù)API-Java語(yǔ)言語(yǔ)法及第三方框架的技術(shù)資料和書(shū)籍非常豐富,相比而言,有關(guān)Java虛擬機(jī)的資料卻顯得異常貧乏。
這種狀況很大程度上是由Java開(kāi)發(fā)技術(shù)本身的一個(gè)重要優(yōu)點(diǎn)導(dǎo)致的:在虛擬機(jī)層面隱藏了底層技術(shù)的復(fù)雜性以及機(jī)器與操作系統(tǒng)的差異性。運(yùn)行程序的物理機(jī)千差萬(wàn)別,而Java虛擬機(jī)則在千差萬(wàn)別的物理機(jī)上面建立了統(tǒng)一的運(yùn)行平臺(tái),實(shí)現(xiàn)了在任意一臺(tái)Java虛擬機(jī)上編譯的程序,都能在任何其他Java虛擬機(jī)上正常運(yùn)行。這一極大的優(yōu)勢(shì)使得Java應(yīng)用的開(kāi)發(fā)比傳統(tǒng)C/C++應(yīng)用的開(kāi)發(fā)更高效快捷,程序員可以把主要精力放在具體業(yè)務(wù)邏輯,而不是放在保障物理硬件的兼容性上。通常情況下,一個(gè)程序員只要了解了必要的Java類(lèi)庫(kù)API-Java語(yǔ)法,學(xué)習(xí)適當(dāng)?shù)牡谌介_(kāi)發(fā)框架,就已經(jīng)基本滿足日常開(kāi)發(fā)的需要了。虛擬機(jī)會(huì)在用戶不知不覺(jué)中完成對(duì)硬件平臺(tái)的兼容及對(duì)內(nèi)存等資源的管理工作。因此,了解虛擬機(jī)的運(yùn)作并不是普通開(kāi)發(fā)人員必備的,或者說(shuō)首要學(xué)習(xí)的知識(shí)。
然而,凡事都具備兩面性。隨著Java技術(shù)的不斷發(fā)展,它已被應(yīng)用于越來(lái)越多的領(lǐng)域之中。其中一些領(lǐng)域,如互聯(lián)網(wǎng)-能源-金融-通信等,對(duì)程序的性能-穩(wěn)定性和擴(kuò)展性方面會(huì)有極高的要求。一段程序很可能在10個(gè)人同時(shí)使用時(shí)完全正常,但是在10 000個(gè)人同時(shí)使用時(shí)就會(huì)緩慢-死鎖甚至崩潰。毫無(wú)疑問(wèn),要滿足10 000個(gè)人同時(shí)使用,需要更高性能的物理硬件,但是在絕大多數(shù)情況下,提升硬件性能無(wú)法等比例提升程序的運(yùn)行性能和并發(fā)能力,甚至有可能對(duì)程序運(yùn)行狀況沒(méi)有任何改善。這里面有Java虛擬機(jī)的原因:為了達(dá)到“所有硬件提供一致的虛擬平臺(tái)”的目的,犧牲了一些硬件相關(guān)的性能特性。更重要的是人為原因:如果開(kāi)發(fā)人員不了解虛擬機(jī)諸多技術(shù)特性的運(yùn)行原理,就無(wú)法寫(xiě)出最適合虛擬機(jī)運(yùn)行和自優(yōu)化的代碼。
其實(shí),目前商用的高性能Java虛擬機(jī)都提供了相當(dāng)多的優(yōu)化參數(shù)和調(diào)節(jié)手段,用于滿足應(yīng)用程序在實(shí)際生產(chǎn)環(huán)境中對(duì)性能和穩(wěn)定性的要求。如果只是為了入門(mén)學(xué)習(xí),讓程序在自己的機(jī)器上正常工作,那么這些特性可以說(shuō)是可有可無(wú)的;但是,如果用于生產(chǎn)開(kāi)發(fā),尤其是大規(guī)模的-企業(yè)級(jí)的生產(chǎn)開(kāi)發(fā),就迫切需要開(kāi)發(fā)人員中至少有一部分人對(duì)虛擬機(jī)的特性及調(diào)節(jié)方法具有很清晰的認(rèn)識(shí)。所以在Java開(kāi)發(fā)體系中,對(duì)架構(gòu)師-系統(tǒng)調(diào)優(yōu)師-高級(jí)程序員等角色的需求一直都非常大。學(xué)習(xí)虛擬機(jī)中各種自動(dòng)運(yùn)作特性的原理也成為Java程序員成長(zhǎng)路上最終必然會(huì)接觸到的一課。通過(guò)本書(shū),讀者可以以一個(gè)相對(duì)輕松的方式學(xué)到虛擬機(jī)的運(yùn)作原理。
【本書(shū)面向的讀者】
(1)使用Java技術(shù)體系的中-高級(jí)開(kāi)發(fā)人員
Java虛擬機(jī)作為中-高級(jí)開(kāi)發(fā)人員修煉的必要知識(shí),有著較高的學(xué)習(xí)門(mén)檻,本書(shū)可作為學(xué)習(xí)虛擬機(jī)的教材。
(2)系統(tǒng)調(diào)優(yōu)師
系統(tǒng)調(diào)優(yōu)師是最近幾年才興起并迅速流行起來(lái)的職業(yè),本書(shū)中的大量案例-代碼和調(diào)優(yōu)實(shí)戰(zhàn)將會(huì)對(duì)系統(tǒng)調(diào)優(yōu)師的日常工作有直接的參考作用。
(3)系統(tǒng)架構(gòu)師
保障系統(tǒng)的性能-并發(fā)和伸縮等能力是系統(tǒng)架構(gòu)師的主要職責(zé)之一,而這部分與虛擬機(jī)的運(yùn)作密不可分,本書(shū)可以作為他們制定應(yīng)用系統(tǒng)底層框架的參考資料。
【如何閱讀本書(shū)】
本書(shū)一共分為五個(gè)部分:走近Java-自動(dòng)內(nèi)存管理-虛擬機(jī)執(zhí)行子系統(tǒng)-程序編譯與代碼優(yōu)化-高效并發(fā)。各個(gè)部分之間基本上是互相獨(dú)立的,沒(méi)有必然的前后依賴關(guān)系,讀者可以從任何一個(gè)感興趣的專題開(kāi)始閱讀,但是每個(gè)部分各個(gè)章節(jié)間則有先后順序。
這里并沒(méi)有假定所有讀者都在Java領(lǐng)域具備特別專業(yè)的技術(shù)水平,因此會(huì)在保證邏輯完整-描述準(zhǔn)確的前提下,盡量用通俗的語(yǔ)言和案例去講述虛擬機(jī)中與開(kāi)發(fā)關(guān)系最為密切的內(nèi)容。但是,本書(shū)畢竟是在探討虛擬機(jī)的工作原理,不可避免地需要讀者有一定的技術(shù)基礎(chǔ),而且本書(shū)的讀者定位是中-高級(jí)程序員群體,對(duì)于一些常用的開(kāi)發(fā)框架-Java類(lèi)庫(kù)API和Java語(yǔ)法等基礎(chǔ)知識(shí)點(diǎn),將假設(shè)讀者已有所了解。
本書(shū)介紹的Java虛擬機(jī)并不局限于某一個(gè)特定發(fā)行商或者某一款特定虛擬機(jī),只是由于OracleJDK/OpenJDK在市場(chǎng)占有率上的絕對(duì)優(yōu)勢(shì),其中的HotSpot虛擬機(jī)不可避免地成為本書(shū)主要分析-講解的對(duì)象,書(shū)中在涉及Java虛擬機(jī)自身實(shí)現(xiàn)相關(guān)的內(nèi)容時(shí),大多將以HotSpot虛擬機(jī)為目標(biāo)對(duì)象來(lái)進(jìn)行講解。但撰寫(xiě)本書(shū)的意圖并不是去做HotSpot的源碼導(dǎo)讀或者解析,書(shū)中所講述的內(nèi)容多為Java虛擬機(jī)的通用原理,即使讀者使用了HotSpot之外的其他Java虛擬機(jī)實(shí)現(xiàn),也會(huì)有所收獲。
最后,非常希望讀者能跟隨本書(shū)的講解,把與實(shí)踐相關(guān)的內(nèi)容親自驗(yàn)證一遍,其中用到的代碼清單可以從華章圖書(shū)的網(wǎng)站(http://www.hzbook.com/)上下載。
【語(yǔ)言約定】
開(kāi)始閱讀本書(shū)之前,在語(yǔ)言和技術(shù)上先與讀者建立如下約定:
JDK從1.5版本開(kāi)始,其官方的正式文檔與宣傳材料中的發(fā)行版本號(hào)啟用了JDK 5-6-7……的新命名方式;從2018年3月發(fā)布的JDK 10起,JDK的開(kāi)發(fā)版本號(hào)(如java -version)也放棄了以前1.x的命名形式,改為按發(fā)布的日期時(shí)間命名。本書(shū)為了行文一致,所有場(chǎng)合統(tǒng)一采用發(fā)行版本號(hào)來(lái)指代所述的JDK版本。
由于版面原因,本書(shū)中的許多示例代碼都沒(méi)有遵循最優(yōu)的程序編寫(xiě)風(fēng)格,如使用的流沒(méi)有關(guān)閉流-直接使用System.out輸出日志等,請(qǐng)讀者在閱讀時(shí)注意這一點(diǎn)。
本書(shū)講解中涉及JDK 7以前HotSpot虛擬機(jī)-JRockit虛擬機(jī)-WebLogic服務(wù)器等產(chǎn)品的所有者時(shí),仍然會(huì)使用BEA和Sun公司的名稱,而不是Oracle。實(shí)際上BEA和Sun分別于2008年和2010年被Oracle公司收購(gòu),現(xiàn)在已經(jīng)不存在這兩個(gè)商標(biāo)了,但是它們毫無(wú)疑問(wèn)都是在Java領(lǐng)域中做出過(guò)卓越貢獻(xiàn)的-值得程序員們紀(jì)念的先驅(qū)企業(yè)。
本書(shū)第3版撰寫(xiě)于2019年中期,此時(shí)JDK 13已有了技術(shù)預(yù)覽版(Early Access),但尚未正式發(fā)布。本書(shū)中所有的講解-討論都是基于這個(gè)時(shí)間點(diǎn)的Java技術(shù)的,但并不針對(duì)特定的JDK版本。如涉及JDK新版本中加入的功能,或在不同版本中有所變化的特性,筆者都會(huì)明確指出JDK的版本號(hào),或?qū)iT(mén)闡述各個(gè)版本間的差異。
【內(nèi)容特色與更新】
本書(shū)的第2版成文于2011至2012年間,出版于2013年,撰寫(xiě)時(shí)是基于早期版本的JDK 7,彼時(shí)正值Oracle全面替代Sun公司領(lǐng)導(dǎo)Java技術(shù)發(fā)展的起點(diǎn)。經(jīng)過(guò)將近十年的時(shí)間,今天JDK版本已經(jīng)發(fā)展到了JDK 12及預(yù)覽版的JDK 13,整個(gè)Java技術(shù)體系一改Sun時(shí)代的遲緩作風(fēng),出現(xiàn)了許多激烈的變革,也涌現(xiàn)了不少令人欣喜的新變化-新風(fēng)潮。我在撰寫(xiě)本書(shū)第3版時(shí),期望能把這些新的變化融合到已有的知識(shí)框架中,修改第2版中讀者反饋的問(wèn)題,提升敘述的準(zhǔn)確性與可讀性,這些期望中的更新使得本書(shū)字?jǐn)?shù)從原有的24萬(wàn)增加到35萬(wàn)。因此,在前言部分,筆者針對(duì)每章列舉出主要更新的內(nèi)容,以便閱讀過(guò)第2版的讀者可以快速定位,獲取到新的知識(shí)。當(dāng)然,如果你尚有余暇,不妨從頭閱讀一次本書(shū),相信會(huì)有與閱讀第2版時(shí)不一樣的體驗(yàn)和收獲。
●第一部分 走近Java
本書(shū)的第一部分為后文的研究和講解建立了良好的基礎(chǔ)。雖然了解Java技術(shù)的來(lái)龍去脈,以及編譯自己的OpenJDK對(duì)于讀者理解Java虛擬機(jī)并不是必須的,但是這些準(zhǔn)備過(guò)程可以為走近Java技術(shù)和Java虛擬機(jī)提供良好的引導(dǎo)。第一部分只有第1章:
第1章 介紹了Java技術(shù)體系過(guò)去-現(xiàn)在的情況以及未來(lái)的發(fā)展趨勢(shì),并在實(shí)踐中介紹了如何自己編譯一個(gè)OpenJDK 12。
第3版更新:續(xù)寫(xiě)了Java技術(shù)發(fā)展史,這幾年Java世界著實(shí)發(fā)生了很多值得記錄的大事件;完全重寫(xiě)了第2版對(duì)未來(lái)Java的展望預(yù)測(cè),當(dāng)時(shí)暢想的Java新發(fā)展新變化全部如約而至,是時(shí)候把聚光燈交給下一個(gè)十年的Java了;OpenJDK開(kāi)發(fā)-編譯也發(fā)生過(guò)不小的變動(dòng),本次更新將OpenJDK編譯的版本提升到12。
●第二部分 自動(dòng)內(nèi)存管理
因?yàn)槌绦騿T把控制內(nèi)存的權(quán)力交給了Java虛擬機(jī),所以可以在編碼的時(shí)候享受自動(dòng)內(nèi)存管理的諸多優(yōu)勢(shì),不過(guò)也正因?yàn)檫@個(gè)原因,一旦出現(xiàn)內(nèi)存泄漏和溢出方面的問(wèn)題,如果不了解虛擬機(jī)是怎樣使用內(nèi)存的,那排查錯(cuò)誤將會(huì)成為一項(xiàng)異常艱難的工作。第二部分包括第2~5章:
第2章 介紹了虛擬機(jī)中內(nèi)存是如何劃分的,哪部分區(qū)域-什么樣的代碼和操作可能導(dǎo)致內(nèi)存溢出異常,并講解了各個(gè)區(qū)域出現(xiàn)內(nèi)存溢出異常的常見(jiàn)原因。
第3版更新:Java運(yùn)行期數(shù)據(jù)區(qū)域是虛擬機(jī)的基礎(chǔ)結(jié)構(gòu),盡管JDK版本在快速發(fā)展,這塊內(nèi)容仍然保持了相對(duì)的穩(wěn)定,主要的變化是JDK 8時(shí)期的永久代的落幕和元空間的登場(chǎng);除此以外,本章著重修正了第2版中對(duì)Java虛擬機(jī)棧描述的含糊與偏差之處,還更新了部分測(cè)試代碼,避免因JDK版本更迭導(dǎo)致與書(shū)中不一樣的結(jié)果。
第3章 介紹了垃圾收集的算法和HotSpot虛擬機(jī)中提供的幾款垃圾收集器的特點(diǎn)及運(yùn)作原理。通過(guò)代碼實(shí)例驗(yàn)證了Java虛擬機(jī)中自動(dòng)內(nèi)存分配及回收的主要規(guī)則。
第3版更新:由于撰寫(xiě)第2版時(shí)JDK 7剛剛發(fā)布,G1收集器尚無(wú)實(shí)踐數(shù)據(jù)可查,書(shū)中對(duì)此講述得比較含糊,本次更新完全重寫(xiě)了這部分內(nèi)容,并重點(diǎn)增加了JDK 11-12中新出現(xiàn)的ZGC和Shenandoah兩款低延遲全并發(fā)收集器的詳細(xì)原理解析,這是垃圾收集器未來(lái)的發(fā)展方向。對(duì)其他與收集器相關(guān)的更新,如統(tǒng)一收集器接口-Epsilon等也都做了對(duì)應(yīng)介紹。此外,針對(duì)HotSpot中收集器實(shí)現(xiàn)的幾個(gè)關(guān)鍵技術(shù)點(diǎn),如解決跨代引用的記憶集與卡表-解決并發(fā)標(biāo)記的增量更新和原始快照算法,還有內(nèi)存讀-寫(xiě)屏障等技術(shù)都增加了專門(mén)的小節(jié)來(lái)進(jìn)行介紹,以便幫讀者在后續(xù)深入閱讀HotSpot設(shè)計(jì)與源碼時(shí)打下良好的理論基礎(chǔ)。
第4章 介紹了隨JDK發(fā)布的基礎(chǔ)命令行工具與可視化的故障處理工具的使用方法。
第3版更新:Java虛擬機(jī)的各種監(jiān)控-管理等輔助工具的功能日益強(qiáng)大,幾乎每個(gè)版本在這些工具的數(shù)量-功能上都會(huì)或多或少有所變化,除了將第2版涉及的工具的變化依照J(rèn)DK版本進(jìn)行升級(jí)外,本章還新增了對(duì)JDK 9中加入的JHSDB的使用講解,并增加了對(duì)JFR和JMC的工作原理和使用方法的介紹,以及對(duì)部分JDK外部的工具(如JIT Watch)的簡(jiǎn)要介紹。
第5章 分享了幾個(gè)比較有代表性的實(shí)際案例,還準(zhǔn)備了一個(gè)所有開(kāi)發(fā)人員都能“親身實(shí)戰(zhàn)”的練習(xí),希望讀者能通過(guò)實(shí)踐來(lái)獲得故障處理和調(diào)優(yōu)的經(jīng)驗(yàn)。
第3版更新:對(duì)案例部分進(jìn)行了更新和增補(bǔ),著重補(bǔ)充了與前3章新增內(nèi)容相對(duì)應(yīng)的問(wèn)題處理案例。不過(guò)對(duì)實(shí)戰(zhàn)部分,軟件版本的落后并未影響筆者要表達(dá)的內(nèi)容,原有的實(shí)戰(zhàn)目前仍具有相同的實(shí)戰(zhàn)價(jià)值,在第3版里筆者也并未刻意將Eclipse和HotSpot升級(jí)后重寫(xiě)一次。
●第三部分 虛擬機(jī)執(zhí)行子系統(tǒng)
執(zhí)行子系統(tǒng)是虛擬機(jī)中必不可少的組成部分,了解了虛擬機(jī)如何執(zhí)行程序,才能更好地理解怎樣才能寫(xiě)出優(yōu)秀的代碼。第三部分包括第6~9章:
第6章 講解了Class文件結(jié)構(gòu)中的各個(gè)組成部分,以及每個(gè)部分的定義-數(shù)據(jù)結(jié)構(gòu)和使用方法,以實(shí)戰(zhàn)的方式演示了Class的數(shù)據(jù)是如何存儲(chǔ)和訪問(wèn)的。
第3版更新:筆者認(rèn)為本章內(nèi)容更適合以“技術(shù)手冊(cè)”的形式存在,即適合查閱多于適合閱讀,但因?yàn)镃lass文件格式是虛擬機(jī)的基礎(chǔ)知識(shí),所以盡管枯燥卻無(wú)法回避。本次更新將Class文件格式的版本跟進(jìn)到了JDK 12,《Java虛擬機(jī)規(guī)范》對(duì)Class文件格式進(jìn)行的增強(qiáng)也會(huì)在本章中反映,內(nèi)容相對(duì)瑣碎。例如,為了實(shí)現(xiàn)JDK 9的Java模塊化系統(tǒng),屬性表中新增了Module-ModulePackages-ModuleMain-Class三項(xiàng)新屬性,常量池中加入了CONSTANT_Module_info和CONSTANT_Package_info兩個(gè)常量。為了實(shí)現(xiàn)JDK 11新增的嵌套內(nèi)(Java中的內(nèi)部類(lèi))訪問(wèn)控制的API,屬性表中又增加了NestHost和NestMembers兩項(xiàng)屬性。為進(jìn)一步加強(qiáng)動(dòng)態(tài)語(yǔ)言支持,CONSTANT_Dynamic_info常量也在JDK 11期間加入常量池……
第7章 介紹了類(lèi)加載過(guò)程的“加載”“驗(yàn)證”“準(zhǔn)備”“解析”和“初始化”五個(gè)階段中虛擬機(jī)分別進(jìn)行了哪些動(dòng)作,還介紹了類(lèi)加載器的工作原理及其對(duì)虛擬機(jī)的意義。
第3版更新:隨著Class文件格式的發(fā)展,類(lèi)加載的各個(gè)過(guò)程都發(fā)生了一些細(xì)節(jié)性變動(dòng),本章將會(huì)按照J(rèn)DK 12版本的《Java虛擬機(jī)規(guī)范》的標(biāo)準(zhǔn)來(lái)同步更新這些內(nèi)容。此外,在JDK 9時(shí)引入了Java模塊化系統(tǒng),這是近年來(lái)Java技術(shù)的一次重要升級(jí),也是對(duì)類(lèi)加載部分影響巨大的一項(xiàng)變革,在本章將加入專門(mén)的小節(jié)對(duì)其進(jìn)行講述。
第8章 分析了虛擬機(jī)在執(zhí)行代碼時(shí),如何找到正確的方法-如何執(zhí)行方法內(nèi)的字節(jié)碼,以及執(zhí)行代碼時(shí)涉及的內(nèi)存結(jié)構(gòu)。
第3版更新:本章講述的是Java虛擬機(jī)執(zhí)行子系統(tǒng)的概念模型,這部分屬于相對(duì)穩(wěn)定的內(nèi)容,變化不大,本次主要更新了Java虛擬機(jī)對(duì)動(dòng)態(tài)類(lèi)型語(yǔ)言支持的增強(qiáng)。
第9章 通過(guò)幾個(gè)類(lèi)加載及執(zhí)行子系統(tǒng)的案例,介紹了使用類(lèi)加載器和處理字節(jié)碼的一些值得欣賞和借鑒的思路,并通過(guò)一個(gè)實(shí)戰(zhàn)練習(xí)加深讀者對(duì)前面理論知識(shí)的理解。
第3版更新:原有章節(jié)所涉及的案例中,程序-類(lèi)庫(kù)-工具的版本已經(jīng)較為陳舊,本次更新對(duì)這些案例涉及的版本進(jìn)行了升級(jí),以反映在模塊化-Lambda表達(dá)式-動(dòng)態(tài)語(yǔ)言等新技術(shù)出現(xiàn)后它們的相應(yīng)變化。
●第四部分 程序編譯與代碼優(yōu)化
Java程序從源碼編譯成字節(jié)碼,再?gòu)淖止?jié)碼編譯成本地機(jī)器碼的這兩個(gè)過(guò)程,從整體來(lái)看其實(shí)等同于一個(gè)傳統(tǒng)編譯器所執(zhí)行的編譯前端-后端過(guò)程。第四部分包括第10~11章:
第10章 分析了Java語(yǔ)言中泛型-主動(dòng)裝箱拆箱-條件編譯等多種語(yǔ)法糖的前因后果,并實(shí)戰(zhàn)練習(xí)了如何使用插入式注解處理器來(lái)完成一個(gè)檢查程序命名規(guī)范的編譯器插件。
第3版更新:對(duì)第2版介紹泛型的小節(jié)進(jìn)行了全文重寫(xiě),描述了不同語(yǔ)言里泛型實(shí)現(xiàn)的方式-Java泛型出現(xiàn)的歷史背景和使用類(lèi)型擦除來(lái)實(shí)現(xiàn)泛型所帶來(lái)的一些限制,并介紹了未來(lái)可能會(huì)在Java中出現(xiàn)的值類(lèi)型等內(nèi)容。
第11章 講解了虛擬機(jī)的熱點(diǎn)探測(cè)方法-HotSpot的即時(shí)編譯器-編譯觸發(fā)條件,以及如何從虛擬機(jī)外部觀察和分析即時(shí)編譯的數(shù)據(jù)和結(jié)果,還選擇了幾種常見(jiàn)的編譯期優(yōu)化技術(shù)進(jìn)行講解。
第3版更新:專門(mén)增加了介紹提前編譯器的章節(jié);由于HotSpot中新的Graal編譯器的加入,書(shū)中除了同步增加Graal編譯器-JVMCI接口等內(nèi)容,為了使讀者可以在HotSpot編譯器上進(jìn)行實(shí)戰(zhàn)練習(xí),在本書(shū)第3版中還新增了許多編譯器的實(shí)戰(zhàn)內(nèi)容。
●第五部分 高效并發(fā)
Java語(yǔ)言和虛擬機(jī)提供了原生的-完善的多線程支持,使得它天生就適合開(kāi)發(fā)多線程并發(fā)的應(yīng)用程序。不過(guò)我們不能期望系統(tǒng)來(lái)完成所有與并發(fā)相關(guān)的處理,了解并發(fā)的內(nèi)幕也是成為一位高級(jí)程序員不可缺少的課程。第五部分包括第12~13章:
第12章 講解了虛擬機(jī)Java內(nèi)存模型的結(jié)構(gòu)及操作,以及原子性-可見(jiàn)性和有序性在Java內(nèi)存模型中的體現(xiàn);介紹了先行發(fā)生原則的規(guī)則及使用,以及線程在Java語(yǔ)言之中是如何實(shí)現(xiàn)的;還提前介紹了目前仍然在實(shí)驗(yàn)室狀態(tài)的Java協(xié)程的相關(guān)內(nèi)容。
第3版更新:重寫(xiě)了原有的對(duì)Java內(nèi)存模型部分過(guò)時(shí)和過(guò)于晦澀的描述,增加了面向Java未來(lái)基于協(xié)程的新并發(fā)模型的介紹。
第13章 介紹了線程安全所涉及的概念和分類(lèi)-同步實(shí)現(xiàn)的方式及虛擬機(jī)的底層運(yùn)作原理,并且介紹了虛擬機(jī)實(shí)現(xiàn)高效并發(fā)所做的一系列鎖優(yōu)化措施。
第3版更新:本章主體內(nèi)容并沒(méi)有過(guò)多變化,但對(duì)不少細(xì)節(jié)進(jìn)行了修飾,對(duì)一些讀者疑問(wèn)較多的地方進(jìn)行了補(bǔ)充講解。
【致 謝】
首先要感謝我的家人,在本書(shū)寫(xiě)作期間全靠他們對(duì)我的悉心照顧,才讓我能夠全身心地投入到寫(xiě)作之中,而無(wú)后顧之憂。
其次要感謝本書(shū)第1-2版的讀者們,因你們的支持,讓本書(shū)成為國(guó)內(nèi)暢銷(xiāo)的原創(chuàng)編程書(shū)籍之一,累計(jì)印刷36次,銷(xiāo)量超過(guò)30萬(wàn)冊(cè);因你們的反饋,讓我能夠在新版中修正前兩版里若干不成熟-不完整,乃至不正確的地方。
同時(shí)要感謝我的工作單位遠(yuǎn)光軟件,公司為我提供了寶貴的工作-學(xué)習(xí)和實(shí)踐的環(huán)境,書(shū)中的許多知識(shí)點(diǎn)都來(lái)自于工作實(shí)踐;也感謝與我一起工作的同事們,非常榮幸能與你們一起在這個(gè)富有激情的團(tuán)隊(duì)中共同奮斗。
還要專門(mén)感謝莫樞(@RednaxelaFX),我認(rèn)為他是國(guó)內(nèi)對(duì)高級(jí)語(yǔ)言虛擬機(jī)知識(shí)普及最有貢獻(xiàn)的幾個(gè)人之一。尤其感謝他在百忙之中抽空審閱本書(shū),提出了許多寶貴的建議和意見(jiàn)。
最后,感謝機(jī)械工業(yè)出版社華章公司的編輯,本書(shū)能夠順利出版,離不開(kāi)他們的敬業(yè)精神和一絲不茍的工作態(tài)度。
周志明
更多建議: