OpenJDK 原始碼的目錄結構
OpenJDK 原始碼的目錄結構
轉載宣告:
本文系轉載自以下文章:
-
jdk原始碼剖析一:OpenJDK-Hotspot原始碼包目錄結構
作者: 只會一點java -
Openjdk 原始碼結構說明(一)
作者:hioeb
轉載僅為方便學習檢視,一切權利屬於原作者,本人只是做了整理和排版,如果帶來不便請聯絡我刪除。
摘要
開啟正文之前,先說一下原始碼剖析這一系列,就以“死磕到底”的精神貫徹始終,JDK–》JRE–》JVM(以openJDK代替)
最近想看看JDK8原始碼,但JDK中JVM(安裝在本地C:\Program Files\Java\jdk1.8.0_121\jre\bin\server下jvm.dll)本身並不開源,只能找來openJDK來看(說是和JDK相似度很高)。原始碼包下載飛機票:
下載完後發現目錄結構很多,大體如下:
0x01 OpenJDK 原始碼的目錄結構
openjdk —— corba:不流行的多語言、分散式通訊介面 —— hotspot:Java 虛擬機器 —— jaxp:XML 處理 —— jaxws:一組 XML web services 的 Java API —— jdk:java 開發工具包 —— —— 針對作業系統的部分 —— —— share:與平臺無關的實現 —— langtools:Java 語言工具 —— nashorn:JVM 上的 JavaScript 執行時
具體如下:
關鍵詞說明
1.1 Corba
全稱Common Object Request Broker Architecture
,通用物件請求代理架構,是基於 物件-服務 機制設計得。與 JavaBean、COM 等是同種範疇。
目前,通用的遠端過程呼叫協議是 SOAP(Simple Object Access Protocol,簡單物件訪問協議),訊息格式是 XML-RPC(存在 Json-RPC)。
另外,Apache Thrift 提供了多語言 C/S 通訊支援;
不少語言也內建了跨語言呼叫或對分散式環境友好,比如:
lua 可以與 c 程式碼互呼叫,go 可以呼叫 C 程式碼,erlang 在本地操作與分散式環境下的操作方法一樣等。
1.2 hotspot
全稱 Java HotSpot Performance Engine,是 Java 虛擬機器的一個實現,包含了伺服器版和桌面應用程式版。利用 JIT 及自適應優化技術(自動查詢效能熱點並進行動態優化)來提高效能。
java -version
可以檢視 Hotspot 的版本。
$ java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
從 Java 1.3 起為預設虛擬機器,現由 Oracle 維護併發布。
其他 java 虛擬機器:
- JRockit:專注於伺服器端,曾經號稱是“世界上速度最快的 Java 虛擬機器”,現歸於 Oracle 旗下。
- J9:IBM 設計的 Java 虛擬機器。
- Harmony:Apache 的頂級專案之一,從 2011 年 11 月 6 日起入駐 Apache 的 Java 專案。雖然其能夠相容 jdk,但由於 JCP (Java Community Process)僅僅允許授權給 Harmony 一個帶有限制條件的TCK(Technology Compatibility Kit),即僅僅能使用在 J2SE ,而不是所有Java實現上(包括 J2ME 和 J2EE),導致了 Apache 組織與 Oracle 的決裂。Harmony 是 Android 虛擬機器 Dalvik 的前身。
- Dalvik 並不是 Java 虛擬機器,它執行的是 dex 檔案而不是 class 檔案,使用的也是暫存器架構而不是棧架構 。
1.3 jaxp
全稱 Java API for XML Processing,處理 XML 的Java API,是 Java XML 程式設計的應用程式介面之一,它提供解析和驗證XML文件的能力。
jaxp 提供了處理 xml 檔案的三種介面:
- DOM 介面(文件物件模型解析),位於 \openjdk\jaxp\src\org\w3c\dom
- SAX 介面(xml 簡單 api 解析),位於 \openjdk\jaxp\src\org\xml\sax
- StAX 介面(xml 流 api),位於 \openjdk\jaxp\src\javax\xml
- 除了解析介面,JAXP還提供了XSLT介面用來對XML文件進行資料和結構的轉換。
1.4 jaxws
全稱 Java API for Web Services
,JAX-WS
允許開發者選擇 RPC-oriented
(面向 RPC) 或者 message-oriented
(訊息通訊,erlang
使用的就是訊息通訊,不過 Java 記憶體模型是記憶體共享)來實現自己的web services
。
通過 Web Services
提供的環境,可以實現 Java 與其他程式語言的互動(事實上就是 thrift 所做的,任何一種語言都可以通過 Web Services 實現與其他語言的通訊,客戶端用一種語言,伺服器端可以用其他語言)。
1.5 jangtools
Java 語言支援工具
1.6 jdk
全稱 Java Development Kit
,即java開發工具包。
1.6.1 share
share
目錄下classes
目錄裡的是 Java 的實現,native
目錄裡的是 C++ 的實現,兩部分基本對應。這兩個目錄裡的結構與 java 的包也是對應,各個部分的用途另外再講。
back、instrument、javavm、npt、transport
幾個部分是實現 java 的基礎部分,都是 C++ 程式碼,在這裡從最底層理解 java,往後這些內容也會詳講。
sample
和 demo
目錄有以下示例,區別在於 demo 目錄是 針對 applets
c 的。
1.7 Nashorn
Nashorn
專案的目的是基於 Java 在 JVM 上實現一個輕量級高效能的 JavaScript
執行環境。基於 JSR-223
協議,Java 程式設計師可在 Java 程式中嵌入 JavaScript 程式碼。
該專案使用了 JSR-229 裡描述的新連線機制(從 Java 7 起開始使用的連線機制):新的位元組碼(invokedynamic)以及新的基於方法控制代碼(method handle)的連線機制。通過介面注入(interface injection)在執行時修改類也是 JSR-229 裡的內容。
0x02 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 單元測試