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