深入理解Java虚拟机(1)——JDK源码分析
JDK編譯和運行
- 系統環境
- 編譯JDK
- 依賴安裝
- 下載源碼
- 打包下載(推薦)
- clone下載
- 編譯
- 構建文檔
- 運行配置
- 構建
- Hello, My JDK
- CLion調試
- 版本選擇
- 生成compile_commands.json
- 編譯
- 配置Toolchains
- 導入項目
- 配置Custom Build Targets
- 配置Run/Debug Configurations
- 測試java -version
- 測試普通java
- 參考文章
- 解決JDK編譯過程問題
- CLion配置
系統環境
- 系統:macOS Big Sur 11.6.1
- JDK IDE:CLion 2021.3.4
- Java IDE:IntelliJ IDEA 2021.3.3 (Ultimate Edition)
- Boot JDK:
java version “11.0.13” 2021-10-19 LTS
Java? SE Runtime Environment 18.9 (build 11.0.13+10-LTS-370)
Java HotSpot? 64-Bit Server VM 18.9 (build 11.0.13+10-LTS-370, mixed mode) - 編譯 JDK:
openjdk version “12-internal” 2019-03-19
OpenJDK Runtime Environment (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f)
OpenJDK 64-Bit Server VM (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f, mixed mode)
編譯JDK
依賴安裝
hg版本管理工具(如果打包下載jdk,可以不用安裝此依賴):
brew install mercurial編譯器緩存:
brew install ccache字體庫:
brew install freetype自動配置:
brew install autoconf如果brew安裝慢,可以問一下搜索引擎配置成阿里云的鏡像,這里不在贅述。
下載源碼
源碼地址:https://hg.openjdk.java.net/jdk/jdk12/file/06222165c35f
有兩種方式可以獲取到源碼,基于國內的網絡安全策略,建議使用第一種方式。
打包下載(推薦)
直接點擊zip或者gz,下載壓縮包,然后解壓到自己的目錄內。
clone下載
hg clone https://hg.openjdk.java.net/jdk/jdk12編譯
構建文檔
編譯之前建議讀一遍源碼里的構建文檔,介紹了基礎的安裝步驟和一些注意事項,以及一些常見錯誤的解決方案,使用chrome翻譯成中文后,對照著原文檔很容易理解。路徑是在${prefix_path}/jdk12-06222165c35f/doc/building.html
${prefix_path} 填寫本地的絕對路徑,例如:/Users/root/jdk-build/jdk12-06222165c35f,后文都以此表示,不在贅述。
運行配置
編譯FastDebug版、僅含Server模式的HotSpot虛擬機:
切換到下載的jdk文件夾下
然后執行一下命令:
bash configure --enable-debug --with-jvm-variants=server如果編譯通過,應該會得到如下信息:
Configuration summary: * Debug level: fastdebug * HS debug level: fastdebug * 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 shenandoahgc vm-structs' * OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64 * Version string: 12-internal+0-adhoc.pengo.jdk12-06222165c35f (12-internal)Tools summary: * Boot JDK: java version "11.0.13" 2021-10-19 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.13+10-LTS-370) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.13+10-LTS-370, mixed mode) (at /Library/Java/JavaVirtualMachines/jdk-11.0.13.jdk/Contents/Home) * Toolchain: clang (clang/LLVM from Xcode 13.2.1) * C Compiler: Version 13.0.0 (at /usr/bin/clang) * C++ Compiler: Version 13.0.0 (at /usr/bin/clang++)Build performance summary: * Cores to use: 8 * Memory limit: 16384 MB構建
make images在這個過程中你可能會遇到許多錯誤,可以參考此篇文章進行解決。傳送門
編譯完成后會輸出如下信息:
Hello, My JDK
現在是測試一下你自己編譯的JDK的時候了:
./build/macosx-x86_64-server-fastdebug/jdk/bin/java -version正常會輸出你編譯的JDK版本號和配置的環境:
CLion調試
版本選擇
書上選擇的版本是CLion 2019.1,本人選擇的版本是CLion 2021.3.4,2019版本可以問一下度娘,基本都有,現在只記錄一下使用2021版本遇到的坑。
生成compile_commands.json
由于2021版本只有open選項,所以要在編譯出來的JDK里生成compile_commands.json后再導入CLion中,https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/ Jetbrains中記錄了這個問題,現在只說一下解決方法。
make CONF=macosx-x86_64-server-fastdebug compile-commandsmacosx-x86_64-server-fastdebug是我本地的版本,可以替換成自己的,如果是第一次編譯,建議設置成和樓主一樣的,下文不再贅述。
之后在build/macosx-x86_64-server-fastdebug/compile_commands.json就可以看到此文件。
編譯
再執行一遍編譯:
make CONF=macosx-x86_64-server-fastdebug配置Toolchains
CLion中Preferences | Build, Execution, Deployment | Toolchains中配置,我是取得默認的。
導入項目
File | Open選中生成的compile_commands.json,然后通過Tools | Compilation Database | Change Project Root把根目錄設置為 jdk12-06222165c35f。
配置Custom Build Targets
Preferences | Build, Execution, Deployment | Custom Build Targets,先Add一個target,然后再增加一個External Tools。
make External Tools 配置信息:
clean External Tools 配置信息:
Program: make Arguments: CONF=macosx-x86_64-server-fastdebug clean Working directory: ${prefix_path}/jdk12-06222165c35f給一個命名:macosx-x86_64-server-fastdebug,然后Build里填寫make External Tools,Clean里填寫clean External Tools
配置Run/Debug Configurations
點擊Edit Configurations,然后新建一個Custom Build Application,給一個命名,然后填寫如下的配置:
Target: macosx-x86_64-server-fastdebug Executable: ${prefix_path}/jdk12-06222165c35f/build/macosx-x86_64-server-fastdebug/jdk/bin/java Program arguments: -version然后刪除掉Before launch里的Build。
可能有許多教程里寫的是新建CMake Application,但樓主在2021版本中新建后,是無法選擇上一步配置的Target的,可以根據自己選擇的CLion版本,新建CMake Application和Custom Build Application都試一下,看一看哪個能用。
測試java -version
然后Run剛剛配置的Config,不出意外意外你應該能得到如下信息:
openjdk version "12-internal" 2019-03-19 OpenJDK Runtime Environment (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f) OpenJDK 64-Bit Server VM (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f, mixed mode)如果是Debug啟動的話,你可能會出現斷點,F9跳過即可,然后打印出下面的信息:
Signal: SIGSEGV (signal SIGSEGV) Signal: SIGSEGV (signal SIGSEGV) Signal: SIGSEGV (signal SIGSEGV) openjdk version "12-internal" 2019-03-19 OpenJDK Runtime Environment (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f) OpenJDK 64-Bit Server VM (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f, mixed mode)有兩種解決方案:
- 在LLDB下執行以下命令
- 或者在~/.lldbinit文件中,添加如下命令
不過樓主沒有配置,各位可以根據情況自己配置。
測試普通java
在IDEA中新建一個項目,然后添加一個普通的類和main方法:
public class Main {public static void main(String[] args) {Thread t1 = new Thread(() -> {System.out.println("thread run");});System.out.println("Hello, My JDK.");t1.start();} }一定要在Source 目錄下新建類,不然可能會報類找不到的異常:
錯誤: 找不到或無法加載主類 Main 原因: java.lang.NoClassDefFoundError: com/pengo/testdemo/testjdk/Main (wrong name: Main)新建一個Custom Build Application,給一個命名,然后填寫如下的配置:
Target: macosx-x86_64-server-fastdebug Executable: ${prefix_path}/jdk12-06222165c35f/build/macosx-x86_64-server-fastdebug/jdk/bin/java Program arguments: Main Working directory: /testdemo/src/main/java/Working directory: 就是你IDEA項目的絕對路徑。
Before launch里配置一個External Tool,目的是把剛剛編寫的Main.java編譯成Main.class。
填寫上如下的配置:
如果一切正常,你會得到如下的信息:
Hello, My JDK. thread run跳轉頂部
參考文章
解決JDK編譯過程問題
https://blog.csdn.net/qq_33543634/article/details/121153063
CLion配置
https://www.jianshu.com/p/0fc877be4c3d
https://blog.csdn.net/IamnotLoveJava/article/details/118543659
跳轉頂部
總結
以上是生活随笔為你收集整理的深入理解Java虚拟机(1)——JDK源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab中find()函数用法
- 下一篇: c treelist绑定mysql_Tr