深入理解JVM的爬坑之路(一)--openjdk環境編譯


構建編譯環境

在讀本書時,為了更好的理解書上的源碼,便開始了此段艱難的環境編譯之路。

本文默認環境是Linux的Ubuntu 16.04 LTS,openJdk版本是14,書上給的網址直接下網速很坑,推薦在git上的地址下載

JDK14u鏈接

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,官網下載

JDK官網

下載完成后,使用如下命令解壓:

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 配置調試都參考於此篇博客,

手把手教你構建、debug、開發Java虛擬機

雖然坎坷,但跌跌撞撞敲開了JVM的大門,拋磚引玉,還請各位大佬不吝賜教。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM