1. 程式人生 > >Java虛擬機器(JVM原始碼):編譯OpenJDK原始碼

Java虛擬機器(JVM原始碼):編譯OpenJDK原始碼

為什麼要自己編譯JDK原始碼

作為一個搞技術的同學,如果想在技術這條路上走下去,還是多研究些本質性的東西,修煉下內功。尤其是現在JDK都出到10了,如果你沒有研究過,還是停留在之前的時代,那麼確實說不過去。做技術還是得有追求。

一、JDK和OpenJDK的異同點

關於兩者之間的聯絡和區別,技術同學已經討論了很多了。
簡單理解下,兩者目前都是甲骨文公司,Sun Jdk也就是我們所說的JDK,是由帶有甲骨文官方發行編譯的。
OpenJdk是開源的,是允許開發者自行編譯研究的。

在stack overflow上也有相關的討論,Sun Jdk和OpenJdk的異同

在知乎上也有蠻多同學的討論:

OpenJdk和Sun Jdk的異同

二、如何編譯OpenJDK原始碼(編譯前準備)

在編譯OpenJDK的時候,因為現在都出到10了,所以推薦大家編譯openJDK10,起碼這個不會落後。
就編譯步驟來說,建議大家參考下面一篇博文,我也是參考的,我會補充一些自己的思路。
Mac版編譯OpenJDK10:參考博文

關於下載原始碼:
我個人推薦使用Git直接從github上拉即可,快。
Git地址:OpenJDK10原始碼

我個人用的是JDK10。

$ java -version
java version "10.0.2" 2018-07-17
Java(TM) SE Runtime Environment 18.3
(build 10.0.2+13) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)

檢視配置詳情:
bash configure -h

這裡寫圖片描述

三、配置構建

$ bash configure --with-debug-level=slowdebug --enable-dtrace --with-jvm-variants=server --with-target-bits=64 --enable-ccache --with-num-cores=8 --with-memory-size=8000  --disable-warnings
-as-errors

配置引數說明:

--with-debug-level=slowdebug 啟用slowdebug級別除錯
--enable-dtrace 啟用dtrace
--with-jvm-variants=server 編譯server型別JVM
--with-target-bits=64 指定JVM為64--enable-ccache 啟用ccache,加快編譯
--with-num-cores=8 編譯使用CPU核心數
--with-memory-size=8000 編譯使用記憶體
--disable-warnings-as-errors 忽略警告

構建成功後如下:

Configuration summary:
* Debug level:    slowdebug
* HS debug level: debug
* JVM variants:   server
* JVM features:   server: 'aot cds cmsgc compiler1 compiler2 dtrace epsilongc g1gc graal jfr jni-check jvmci jvmti management nmt parallelgc serialgc services vm-structs' 
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64
* Version string: 12-internal+0-adhoc.wangdong.openjdk (12-internal)

Tools summary:
* Boot JDK:       java version "10.0.2" 2018-07-17 Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)  (at /Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home)
* Toolchain:      clang (clang/LLVM from Xcode 9.4.1)
* C Compiler:     Version 9.1.0 (at /usr/bin/clang)
* C++ Compiler:   Version 9.1.0 (at /usr/bin/clang++)

Build performance summary:
* Cores to use:   7
* Memory limit:   8000 MB
* ccache status:  Active (3.4.2)

四、編譯

make images

編譯成功後如下:大概可能需要幾分鐘

Note: Recompile with -Xlint:unchecked for details.
Creating support/demos/image/jfc/CodePointIM/CodePointIM.jar
Creating support/demos/image/jfc/FileChooserDemo/FileChooserDemo.jar
Creating support/demos/image/jfc/Font2DTest/Font2DTest.jar
Creating support/demos/image/jfc/SwingSet2/SwingSet2.jar
Creating support/demos/image/jfc/J2Ddemo/J2Ddemo.jar
Creating support/demos/image/jfc/Metalworks/Metalworks.jar
Creating support/demos/image/jfc/Notepad/Notepad.jar
Creating support/demos/image/jfc/Stylepad/Stylepad.jar
Creating support/demos/image/jfc/SampleTree/SampleTree.jar
Creating support/demos/image/jfc/TableExample/TableExample.jar
Creating support/demos/image/jfc/TransparentRuler/TransparentRuler.jar
Creating support/classlist.jar
Creating images/jmods/jdk.jlink.jmod
Creating images/jmods/java.base.jmod
Creating jdk image
Stopping sjavac server
Finished building target 'images' in configuration 'macosx-x86_64-normal-server-slowdebug'

五、驗證是否編譯成功

一定要進入到編譯後的bin包裡面。
這裡面有個java可執行檔案,這個是我們需要的。
這裡寫圖片描述

執行./java -version命令
這裡寫圖片描述

出現以下即為編譯成功:

~/Develop/OpenJdk/openjdk/build/macosx-x86_64-normal-server-slowdebug/jdk/bin on  jdk/jdk!20:37:11
$ ./java -version
openjdk version "12-internal" 2019-03-19
OpenJDK Runtime Environment (slowdebug build 12-internal+0-adhoc.wangdong.openjdk)
OpenJDK 64-Bit Server VM (slowdebug build 12-internal+0-adhoc.wangdong.openjdk, mixed mode)

如果你在編譯的過程中,出現了什麼問題,請留言。
交流、總結、進步!