《HotSpot實(shí)戰(zhàn)》深入淺出地講解了HotSpot虛擬機(jī)的工作原理,將隱藏在它內(nèi)部的本質(zhì)內(nèi)容逐一呈現(xiàn)在讀者面前,包括OpenJDK與HotSpot項(xiàng)目、編譯和調(diào)試HotSpot的方法、HotSpot內(nèi)核結(jié)構(gòu)、Launcher、OOP-Klass對(duì)象表示系統(tǒng)、鏈接、運(yùn)行時(shí)數(shù)據(jù)區(qū)、方法區(qū)、常量池和常量池Cache、Perf Data、Crash分析方法、轉(zhuǎn)儲(chǔ)分析方法、垃圾收集器的設(shè)計(jì)演進(jìn)、CMS和G1收集器、棧、JVM對(duì)硬件寄存器的利用、棧頂緩存技術(shù)、解釋器、字節(jié)碼表、轉(zhuǎn)發(fā)表、Stubs、Code Cache、Code生成器、JIT編譯器、C1編譯器、編譯原理、JVM指令集實(shí)現(xiàn)、函數(shù)的分發(fā)機(jī)制、VTABLE和ITABLE、異常表、虛擬機(jī)監(jiān)控工具(如jinfo、jstack、jhat、jmap等)的實(shí)現(xiàn)原理和開(kāi)發(fā)方法、Attach機(jī)制、基于GUI的JVM分析工具(如MAT、VisualVM)等內(nèi)容。
除了HotSpot技術(shù),《HotSpot實(shí)戰(zhàn)》還對(duì)方法論進(jìn)行了探討。在各個(gè)章節(jié)的講解中,都會(huì)有一些與系統(tǒng)運(yùn)行機(jī)制相關(guān)的實(shí)戰(zhàn)或練習(xí),供讀者練手。通過(guò)這些實(shí)戰(zhàn)練習(xí),不僅有助于讀者加深對(duì)知識(shí)或原理的理解,更為重要的是,它還可以培養(yǎng)讀者獨(dú)立探索的思維方式,這有助于讀者把知識(shí)融會(huì)貫通并靈活應(yīng)用到實(shí)際項(xiàng)目中。
《HotSpot實(shí)戰(zhàn)》適合于已具有一定Java編程基礎(chǔ)的讀者,以及在Java或基于JVM的編程語(yǔ)言平臺(tái)下進(jìn)行各類軟件開(kāi)發(fā)的開(kāi)發(fā)人員、測(cè)試人員和運(yùn)維人員。對(duì)于JVM和編程語(yǔ)言愛(ài)好者來(lái)說(shuō),《HotSpot實(shí)戰(zhàn)》也具有一定的學(xué)習(xí)參考價(jià)值。
“蚓無(wú)爪牙之利,筋骨之強(qiáng),上食埃土,下飲黃泉,用心一也。蟹六跪而二螯,非蛇蟮之穴無(wú)可寄托者,用心躁也”。對(duì)于技術(shù)人員來(lái)說(shuō),如果長(zhǎng)期忽略自身技術(shù)的根基而去一昧地追求高層框架技術(shù),這無(wú)疑是舍本求末的做法! ∠噍^于C或C++程序員,我發(fā)現(xiàn)Java程序員更容易忽視基礎(chǔ)技術(shù)。JVM的出現(xiàn),為程序員屏蔽了操作系統(tǒng)與硬件的細(xì)節(jié),使得程序員從諸如內(nèi)存管理這樣的繁瑣任務(wù)中解放出來(lái)。但這不并等同于允許Java程序員放棄對(duì)基礎(chǔ)的重視。我們是否有過(guò)這樣的經(jīng)歷,在遇到內(nèi)存故障、丟包、網(wǎng)絡(luò)協(xié)議設(shè)計(jì)、資源瓶頸、證書(shū)、二進(jìn)制等問(wèn)題時(shí),往往會(huì)覺(jué)得比較棘手,在尋求解決思路時(shí)更是顯得力不從心。這實(shí)質(zhì)上是自身技術(shù)遇到了瓶頸難以突破所致?膳碌氖牵肴ド罹康臅r(shí)候卻無(wú)從下手! ∥覍(xiě)這本書(shū)的初衷是為了喚起Java程序員對(duì)于基礎(chǔ)技術(shù)的重視。事實(shí)上,任何平臺(tái)的程序員都應(yīng)當(dāng)了解平臺(tái)的基本特性、實(shí)現(xiàn)機(jī)制以及接口,這是提高自身修養(yǎng)的必經(jīng)之路。對(duì)于Java程序員來(lái)說(shuō),我們需要了解的平臺(tái)就是JVM。了解JVM的基本實(shí)現(xiàn)機(jī)制,不僅對(duì)于解決實(shí)際應(yīng)用中諸如GC等虛擬機(jī)問(wèn)題時(shí)有直接幫助,還有利于我們更好地理解語(yǔ)言本身! ∷业氖,Oracle官方已經(jīng)將虛擬機(jī)項(xiàng)目的源碼開(kāi)放出來(lái),這對(duì)于我們來(lái)說(shuō)簡(jiǎn)直就是福音。本書(shū)將以O(shè)penJDK和HotSpot為素材,深入淺出地講解我們最為熟悉的一款虛擬機(jī)產(chǎn)品的實(shí)現(xiàn)。除了Java程序員,從事與Java或JVM相關(guān)的開(kāi)發(fā)、測(cè)試、運(yùn)維等技術(shù)人員也將在本書(shū)中獲益。
陳濤,碩士,畢業(yè)于中國(guó)科技大學(xué),F(xiàn)就職于網(wǎng)易公司旗下的網(wǎng)易寶,從事在線支付系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)工作。在從事Java工作之前 ,曾有過(guò)Linux內(nèi)核及驅(qū)動(dòng)開(kāi)發(fā)工作經(jīng)驗(yàn)。熱衷于專研技術(shù),對(duì)編程語(yǔ)言和JVM比較感興趣。工作之余 ,喜歡足球和武俠帶來(lái)的樂(lè)趣。目前正在“專研”的課題是如何做一名稱職的奶爸。
第1章 初識(shí)HotSpot
1.1 JDK概述
1.1.1 JCP與JSR
1.1.2 JDK的發(fā)展歷程
1.1.3 Java 7的語(yǔ)法變化
1.2 動(dòng)手編譯虛擬機(jī)
1.2.1 源代碼下載
1.2.2 HotSpot源代碼結(jié)構(gòu)
1.2.3 搭建編譯環(huán)境
1.2.4 編譯目標(biāo)
1.2.5 編譯過(guò)程
1.2.6 編譯常見(jiàn)問(wèn)題
1.3 實(shí)戰(zhàn):在HotSpot內(nèi)調(diào)試HelloWorld
1.3.1 認(rèn)識(shí)GDB
1.3.2 準(zhǔn)備調(diào)試腳本
第1章 初識(shí)HotSpot
1.1 JDK概述
1.1.1 JCP與JSR
1.1.2 JDK的發(fā)展歷程
1.1.3 Java 7的語(yǔ)法變化
1.2 動(dòng)手編譯虛擬機(jī)
1.2.1 源代碼下載
1.2.2 HotSpot源代碼結(jié)構(gòu)
1.2.3 搭建編譯環(huán)境
1.2.4 編譯目標(biāo)
1.2.5 編譯過(guò)程
1.2.6 編譯常見(jiàn)問(wèn)題
1.3 實(shí)戰(zhàn):在HotSpot內(nèi)調(diào)試HelloWorld
1.3.1 認(rèn)識(shí)GDB
1.3.2 準(zhǔn)備調(diào)試腳本
1.4 小結(jié)
第2章 啟動(dòng)
2.1 HotSpot內(nèi)核
2.1.1 如何閱讀源代碼
2.1.2 HotSpot內(nèi)核框架
2.1.3 Prims
2.1.4 Services
2.1.5 Runtime
2.2 啟動(dòng)
2.2.1 Launcher
2.2.2 虛擬機(jī)生命周期
2.2.3 入口:main函數(shù)
2.2.4 主線程
2.2.5 InitializeJVM函數(shù)
2.2.6 JNI_CreateJavaVM函數(shù)
2.2.7 調(diào)用Java主方法
2.2.8 JVM退出路徑
2.3 系統(tǒng)初始化
2.3.1 配置OS模塊
2.3.2 配置系統(tǒng)屬性
2.3.3 加載系統(tǒng)庫(kù)
2.3.4 啟動(dòng)線程
2.3.5 vm_init_globals函數(shù):初始化全局?jǐn)?shù)據(jù)結(jié)構(gòu)
2.3.6 init_globals函數(shù):初始化全局模塊
2.4 小結(jié)
第3章 類與對(duì)象
3.1 對(duì)象表示機(jī)制
3.1.1 OOP-Klass二分模型
3.1.2 Oops模塊
3.1.3 OOP框架與對(duì)象訪問(wèn)機(jī)制
3.1.4 Klass與instanceKlass
3.1.5 實(shí)戰(zhàn):用HSDB調(diào)試HotSpot
3.2 類的狀態(tài)轉(zhuǎn)換
3.2.1 入口:Class文件
3.2.2 類的狀態(tài)
3.2.3 加載
3.2.4 鏈接
3.2.5 初始化
3.2.6 實(shí)戰(zhàn):類的“族譜”
3.2.7 實(shí)戰(zhàn):系統(tǒng)字典
3.3 創(chuàng)建對(duì)象
3.3.1 實(shí)例對(duì)象的創(chuàng)建流程
3.3.2 實(shí)戰(zhàn):探測(cè)JVM內(nèi)部對(duì)象
3.4 小結(jié)
第4章 運(yùn)行時(shí)數(shù)據(jù)區(qū)
4.1 堆
4.1.1 Java的自動(dòng)內(nèi)存管理
4.1.2 堆的管理
4.2 線程私有區(qū)域
4.2.1 PC
4.2.2 JVM!
4.3 方法區(qū)
4.3.1 紐帶作用
4.3.2 常量池
4.3.3 常量池緩存:ConstantPoolCache
4.3.4 方法的表示:methodOop
4.3.5 方法的解析:將符號(hào)引用轉(zhuǎn)換成直接引用
4.3.6 代碼放在哪里:ConstMethodOop
4.3.7 實(shí)戰(zhàn):探測(cè)運(yùn)行時(shí)常量池
4.4 性能監(jiān)控?cái)?shù)據(jù)區(qū):Perf Data
4.4.1 描述這段空間:PerfMemory
4.4.2 查看
4.4.3 生產(chǎn)
4.5 轉(zhuǎn)儲(chǔ)
4.5.1 用VisualVM進(jìn)行轉(zhuǎn)儲(chǔ)分析
4.5.2 JVM Crash
4.6 小結(jié)
第5章 垃圾收集
5.1 堆與GC
5.1.1 垃圾收集
5.1.2 分代收集
5.1.3 快速分配
5.1.4 棧上分配和逸出分析
5.1.5 GC公共模塊
5.2 垃圾收集器
5.2.1 設(shè)計(jì)演進(jìn)
5.2.2 CMS收集器
5.2.3 G1收集器
5.3 實(shí)戰(zhàn):性能分析方法
5.3.1 獲取GC日志
5.3.2 GC監(jiān)控信息
5.3.3 內(nèi)存分析工具
5.3.4 選擇合適的收集器與GC性能評(píng)估
5.3.5 不要忽略JVM Crash日志
5.4 小結(jié)
第6章 !
6.1 硬件背景:了解真實(shí)機(jī)器
6.1.1 程序是如何運(yùn)行的
6.1.2 x86與棧幀
6.1.3 ARM對(duì)Java硬件級(jí)加速:Jazelle技術(shù)
6.2 Java!
6.2.1 寄存器式指令集與棧式指令集
6.2.2 HotSpot中的!
6.2.3 棧幀
6.2.4 充分利用寄存器資源
6.2.5 虛擬機(jī)如何調(diào)用Java函數(shù)
6.2.6 優(yōu)化:棧頂緩存
6.2.7 實(shí)戰(zhàn):操作數(shù)!
6.3 小結(jié)
第7章 解釋器和即時(shí)編譯器
7.1 概述
7.2 解釋器如何工作
7.2.1 Interpreter模塊
7.2.2 Code模塊
7.2.3 字節(jié)碼表
7.2.4 Code Cache
7.2.5 InterpreterCodelet與Stub隊(duì)列
7.2.6 Code生成器
7.2.7 模板表與轉(zhuǎn)發(fā)表
7.2.8 實(shí)戰(zhàn):InterpreterCodelet
7.3 即時(shí)編譯器
7.3.1 概述
7.3.2 編譯器模塊
7.3.3 編譯器的基本結(jié)構(gòu)
7.3.4 實(shí)戰(zhàn):編譯原理實(shí)踐,了解編譯中間環(huán)節(jié)
7.4 小結(jié)
第8章 指令集
8.1 再說(shuō)棧式指令集
8.2 數(shù)據(jù)傳送
8.2.1 局部變量、常量池和操作數(shù)棧之間的數(shù)據(jù)傳送
8.2.2 數(shù)據(jù)傳送指令
8.2.3 實(shí)戰(zhàn):數(shù)組的越界檢查
8.3 類型轉(zhuǎn)換
8.4 對(duì)象的創(chuàng)建和操作
8.5 程序流程控制
8.5.1 控制轉(zhuǎn)移指令
8.5.2 條件轉(zhuǎn)移
8.5.3 無(wú)條件轉(zhuǎn)移
8.5.4 復(fù)合條件轉(zhuǎn)移
8.5.5 實(shí)戰(zhàn):switch語(yǔ)句如何使用String
8.6 運(yùn)算
8.6.1 加法:iadd
8.6.2 取負(fù):ineg
8.7 函數(shù)的調(diào)用和返回
8.7.1 Java函數(shù)分發(fā)機(jī)制:VTABLE與ITABLE
8.7.2 invoke系列指令
8.7.3 動(dòng)態(tài)分發(fā):覆蓋
8.7.4 靜態(tài)分發(fā):重載
8.8 異!
8.8.1 異常表
8.8.2 創(chuàng)建異!
8.8.3 try-catch
8.8.4 finally
8.9 小結(jié)
第9章 虛擬機(jī)監(jiān)控工具
9.1 Attach機(jī)制
9.1.1 AttachProvider與VirtualMachine
9.1.2 命令的下發(fā):execute()
9.1.3 命令的執(zhí)行:Attach Listener守護(hù)線程
9.2 查看JVM進(jìn)程
9.2.1 用jps查看Java進(jìn)程
9.2.2 實(shí)戰(zhàn):定制jps,允許查看庫(kù)路徑
9.3 查看和配置JVM
9.3.1 用jinfo查看JVM參數(shù)配置
9.3.2 實(shí)戰(zhàn):擴(kuò)展flags選項(xiàng),允許查看命令行參數(shù)
9.4 堆內(nèi)存轉(zhuǎn)儲(chǔ)工具
9.4.1 Heap Dump
9.4.2 原理
9.5 堆轉(zhuǎn)儲(chǔ)分析
9.5.1 Heap Dump分析工具:jhat
9.5.2 實(shí)戰(zhàn):MAT分析過(guò)程
9.6 線程轉(zhuǎn)儲(chǔ)分析
9.6.1 jstack
9.6.2 實(shí)戰(zhàn):如何分析資源等待
9.7 小結(jié)