之前已經介紹了在Ubuntu 16.04上編譯OpenJDK8的源代碼和調試HotSpot源代碼。這一章將介紹HotSpot項目的目錄結構。
HotSpot目錄下主要由agent、make、src和test這4個子目錄構成。其中agent目錄下包含了Serviceability Agent的客戶端實現;make目錄下包含了用於編譯HotSpot的各種配置文件;src目錄是最重要的一個目錄,本書講解的所有源代碼都包含在這個目錄下;test目錄下包含HotSpot相關的一些單元測試用例。
src目錄的結構如下圖所示。
src目錄下包含了HotSpot項目的主體源代碼,主要由cpu、os、os_cpu與share這4個子目錄構成。下面簡單介紹一下這4個子目錄,如下:
-
cpu目錄:此目錄下包含一些依賴具體處理器架構的代碼,現在主流的處理器架構主要有sparc、x86和zero,其中x86又最為常見,筆者的電腦cpu也是x86架構,所以在在涉及到相關源代碼實現時,只會講解x86目錄下的源代碼實現。
-
os目錄:此目錄下包含一些依賴操作系統的代碼,主要的操作系統有基於linux內核的操作系統、基於unix的操作系統(posix)、windows和solaris。筆者的電腦是基於linux內核的Ubuntu操作系統,所以在涉及到相關源代碼實現時,只會講解linux目錄下的源代碼實現。
-
os_cpu目錄:此目錄下包含一些依賴操作系統和處理器架構的代碼,如linux_x86目錄。linux_x86目錄下包含的就是基於linux內核的操作系統和x86處理器架構相關的代碼,也是筆者本書要講解的源代碼實現。
-
share目錄:此目錄下包含了獨立於操作系統和處理器架構的代碼,尤其是vm子目錄,這個子目錄中包含的內容比較多,HotSpot主要的一些功能模塊都包含在這個子目錄下。下表介紹了vm目錄下一些重要子目錄的功能。
目錄 |
描述 |
adlc |
平台描述文件 |
asm |
匯編器 |
c1 |
C1編譯器,即client編譯器 |
ci |
動態編譯器 |
classfile |
Class文件解析和類的鏈接等 |
code |
機器碼生成 |
compiler |
調用動態編譯器的接口 |
Opto |
C2編譯器,即server編譯器 |
gc_interface |
GC接口 |
gc_implementation |
垃圾收集器的具體實現 |
interpreter |
解釋器 |
libadt |
抽象數據結構 |
memory |
內存管理 |
oops |
JVM內部對象表示 |
prims |
HotSpot對外接口 |
runtime |
運行時 |
services |
JMX接口 |
utilizes |
內部工具類和公共函數 |
1、在Ubuntu 16.04上編譯OpenJDK8的源代碼
13、類加載器
14、類的雙親委派機制
15、核心類的預裝載
16、Java主類的裝載
17、觸發類的裝載
18、類文件介紹
19、文件流
20、解析Class文件
21、常量池解析(1)
22、常量池解析(2)
23、字段解析(1)
24、字段解析之偽共享(2)
25、字段解析(3)
28、方法解析
29、klassVtable與klassItable類的介紹
30、計算vtable的大小
31、計算itable的大小
32、解析Class文件之創建InstanceKlass對象
33、字段解析之字段注入
34、類的連接
35、類的連接之驗證
36、類的連接之重寫(1)
37、類的連接之重寫(2)
38、方法的連接
39、初始化vtable
40、初始化itable
41、類的初始化
42、對象的創建
43、Java引用類型
作者持續維護的個人博客 classloading.com。
關注公眾號,有HotSpot源碼剖析系列文章!