1. 程式人生 > >OpenJDK 原始碼的目錄結構

OpenJDK 原始碼的目錄結構

OpenJDK 原始碼的目錄結構

轉載宣告:

本文系轉載自以下文章:

轉載僅為方便學習檢視,一切權利屬於原作者,本人只是做了整理和排版,如果帶來不便請聯絡我刪除。

摘要

開啟正文之前,先說一下原始碼剖析這一系列,就以“死磕到底”的精神貫徹始終,JDK–》JRE–》JVM(以openJDK代替)

最近想看看JDK8原始碼,但JDK中JVM(安裝在本地C:\Program Files\Java\jdk1.8.0_121\jre\bin\server下jvm.dll)本身並不開源,只能找來openJDK來看(說是和JDK相似度很高)。原始碼包下載飛機票:

http://download.java.net/openjdk/jdk8 (有時會壞,附上百度網盤https://pan.baidu.com/s/1o8bXbPC) 下載openjdk-8-src-b132-03_mar_2014.zip
下載完後發現目錄結構很多,大體如下:

0x01 OpenJDK 原始碼的目錄結構

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 ServicesJAX-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,往後這些內容也會詳講。

sampledemo 目錄有以下示例,區別在於 demo 目錄是 針對 appletsc 的。

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                             單元測試