構建編譯環境
起 在讀本書時,為了更好的理解書上的源碼,便開始了此段艱難的環境編譯之路。
本文默認環境是Linux的Ubuntu 16.04 LTS,openJdk版本是14,書上給的網址直接下網速很坑,推薦在git上的地址下載
1. 安裝基礎環境
首先需安裝GCC或CLang來進行編譯,確保最低版本為GCC4.8 或者CLang 3.2 以上,安裝GCC的命令為:
sudo apt-get install build-essential
編譯過程中需要依賴FreeType,CUPS等若干第三方庫,所依賴庫在下列表格列出,執行對應安裝命令即可。
工具 | 庫名稱 | 安裝名稱 |
---|---|---|
FreeType | The FreeType Project | sudo apt-get install libfreetype6-dev |
CUPS | Common UNIX Printing System | sudo apt-get install libcups2-dev |
X11 | X Window System | sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev |
ALSA | Advanced Linux Sound Architecture | sudo apt-get install libasound2-dev |
libffi | Portable Foreign Function Interface Library | sudo apt-get install libffi-dev |
Autoconf | Extensible Package of M4 Macros | sudo apt-get install autoconf |
2. 安裝JDK
編譯jdk 需要安裝N-1的已經編譯好的JDk,安裝過程如下,由於需要編譯openjdk14u,所以需要安裝一下jdk13,官網下載
下載完成后,使用如下命令解壓:
tar -xvf jdk-13.0.2_linux-x64_bin.tar.gz
將解壓后的文件夾移動到/opt 目錄
sudo mv jdk-13.0.2 /opt/
配置Java環境:
sudo tee /etc/profile.d/jdk13.0.2.sh <<EOF
export JAVA_HOME=/opt/jdk-13.0.2
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
導出配置文件並檢查Java命令:
source /etc/profile.d/jdk13.0.2.sh
若不想每次都在用jdk的時候先source一下,可以配置永久環境變量
sudo gedit ~/.bashrc
然后在文件末尾添加 source /etc/profile.d/jdk13.0.2.sh
然后查看java版本
java -version
3. 開始編譯
首先先生成bash configure命令
bash configure --enable-debug --with-jvm-variants=server // 編譯FastDebug版,僅含Server模式的HotSpot虛擬機
configure 命令承擔了依賴項檢查、參數配置和構建輸出目錄結構等多項職責,如果編譯過程中需要的工具鏈或者依賴項有缺失,命令執行后會得到明確的提示,並給出該依賴的安裝命令。
完成后,執行
make all
注意,當目錄結構產生后又修改了配置或者多次編譯,必須先使用make clean和make dist-clean清理目錄,才能確保新的配置生效。
4. 使用IDE調試源碼
當然,作為一個標准型碼農,只有能運行和跟蹤調試程序才能是手握雷電,故而安裝IDE來進行HotSpot源碼調試。
本次使用的是 JetBrians的Clion,可直接在JetBrains官網下載,而且可以免費試用30天。
安裝后,新建項目,選擇”New CMake Project from Sources“ , 選擇jdk14u下面的src/hotspot目錄,然后點Ok,Clion會自動配置好CMake項目使用的CMakeLists.txt ,並且構建代碼索引,符號表等。
加載后,添加一個新的configuration。如圖
點擊Configure Custom Build Targets,點擊add
Name 設置成openjdk,點擊Build 右邊的 ... 圖標,創建External Tools,
點擊左上角+,創建tool,name填make,Program填make,Working directory 選擇openjdk的代碼目錄路徑,點擊確定,保存。
然后在如下界面,選擇創建好的target。Executable選擇build出來的jdk的java文件,即路徑為 jdk14u/build/linux-x86_64-server-fastdebug/jdk/bin/java。Program arguments 暫時填一個-version。最后保存。
然后運行debug
IDE代碼中大量紅色提示
在查看源碼的cpp文件,會發現有很多紅色的提示,且無法跳轉,解決如下:
修改CMakeLists.txt ,加上如下的幾行,然后Reload changes,即可有效解決。
include_directories(share)
include_directories(../java.base/unix/native/include)
include_directories(../java.base/share/native/include)
include_directories(../../build/linux-x86_64-server-fastdebug/jdk/include)
include_directories(../../build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc)
include_directories(../../build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc/jvmtifiles)
小結
深入理解Java虛擬機關於IDE編譯有點泛,這邊參考了 劉正陽大佬的 博客,本文后半部分的Clion 配置調試都參考於此篇博客,
雖然坎坷,但跌跌撞撞敲開了JVM的大門,拋磚引玉,還請各位大佬不吝賜教。