1. 程式人生 > >jdk原始碼解析(一)

jdk原始碼解析(一)

1、先說一下原始碼解析的過程:JDK-->JRE-->JVM(以openJDK代替)
注意:這裡要了解jdk和jre和jvm他們分別是什麼?以及他們的關係才可以繼續。這裡先上一章從網上下載的關係圖方便理解


2、筆者本地的jdk是oraclejdk,jvm所在位置就是安裝的jdk。jdk下jre下bin下server下的jvm.dll。也就是F:\Java\jdk\jdk1.7.0_60\jre\bin\server這裡的jvm.dll。因為jvm.dll不能看,所以這裡以下載的openjdk原始碼作為解析(openjdk-7u40-fcs-src-b43-26_aug_2013.zip)。

3、openjdk原始碼目錄結構這裡上圖:


解釋:

openjdk 
—— corba:不流行的多語言、分散式通訊介面 
—— hotspot:Java 虛擬機器 
—— jaxp:XML 處理 
—— jaxws:一組 XML web services 的 Java API 
—— jdk:java 開發工具包 
—— —— 針對作業系統的部分 
—— —— share:與平臺無關的實現 
—— langtools:Java 語言工具 
—— nashorn:JVM 上的 JavaScript 執行時

4、因為要了解jvm虛擬機器。所以進入hotspot目錄下

其中Hotspot就是我們要看的JVM

Hotspot:全稱 Java HotSpot Performance Engine,是 Java 虛擬機器的一個實現,包含了伺服器版和桌面應用程式版。利用 JIT 及自適應優化技術(自動查詢效能熱點並進行動態優化)來提高效能。

使用 java -version 可以檢視 Hotspot 的版本。
[[email protected] ~]$ java -version
openjdk version "1.8.0_144"
OpenJDK Runtime Environment (build 1.8.0_144-b01)
OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode)
[
[email protected]
~]$
OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode)就是版本。

所以:我們詳解hotspot目錄結構

├─agent                                   Serviceability Agent的客戶端實現
├─make                                    用來build出HotSpot的各種配置檔案
├─src                                       HotSpot VM的原始碼
│  ├─cpu                                  CPU相關程式碼(彙編器、模板直譯器、ad檔案、部分runtime函式在這裡實現)
│  ├─os                                    操作系相關程式碼
│  ├─os_cpu                             作業系統+CPU的組合相關的程式碼
│  └─share                               平臺無關的共通程式碼
│      ├─tools                            工具
│      │  ├─hsdis                        反彙編外掛
│      │  ├─IdealGraphVisualizer       將server編譯器的中間程式碼視覺化的工具
│      │  ├─launcher                         啟動程式“java”
│      │  ├─LogCompilation             將-XX:+LogCompilation輸出的日誌(hotspot.log)整理成更容易閱讀的格式的工具
│      │  └─ProjectCreator               生成Visual Studio的project檔案的工具
│      └─vm                                    HotSpot VM的核心程式碼
│          ├─adlc                       平臺描述檔案(上面的cpu或os_cpu裡的*.ad檔案)的編譯器
│          ├─asm                        彙編器介面
│          ├─c1                          client編譯器(又稱“C1”)
│          ├─ci                           動態編譯器的公共服務/從動態編譯器到VM的介面
│          ├─classfile                  類檔案的處理(包括類載入和系統符號表等)
│          ├─code                       動態生成的程式碼的管理
│          ├─compiler                   從VM呼叫動態編譯器的介面
│          ├─gc_implementation                GC的實現
│          │  ├─concurrentMarkSweep      Concurrent Mark Sweep GC的實現
│          │  ├─g1                                     Garbage-First GC的實現(不使用老的分代式GC框架)
│          │  ├─parallelScavenge               ParallelScavenge GC的實現(server VM預設,不使用老的分代式GC框架)
│          │  ├─parNew                             ParNew GC的實現
│          │  └─shared                               GC的共通實現
│          ├─gc_interface                           GC的介面
│          ├─interpreter                直譯器,包括“模板直譯器”(官方版在用)和“C++直譯器”(官方版不在用)
│          ├─libadt                       一些抽象資料結構
│          ├─memory                     記憶體管理相關(老的分代式GC框架也在這裡)
│          ├─oops                       HotSpot VM的物件系統的實現
│          ├─opto                       server編譯器(又稱“C2”或“Opto”)
│          ├─prims                      HotSpot VM的對外介面,包括部分標準庫的native部分和JVMTI實現
│          ├─runtime                    執行時支援庫(包括執行緒管理、編譯器排程、鎖、反射等)
│          ├─services                   主要是用來支援JMX之類的管理功能的介面
│          ├─shark                      基於LLVM的JIT編譯器(官方版裡沒有使用)
│          └─utilities                    一些基本的工具類
└─test                             單元測試

具體瞭解先將到這裡。