為什么需要編譯自己的jvm源碼?
想象下, 你想看看java線程是如何start
的?
去源碼里一找 native void start0()
, 此時如果你對jvm源碼比較熟悉, 那么可以下載openJDK源碼借助vscode去查詢底層實現, 但如果你不知道呢?
又比如 java高並發編程藝術
一書中說final
在構造函數return
之前會添加一個StoreStore
內存屏障,在初次讀取前會添加一個LoadLoad
內存屏障, 那么您怎么做? (方法也有, 根據反匯編查找到有個關鍵字JVM_ACC_FINAL
在vscode上查找這個關鍵字會知道一個叫is_final
的方法,借助這個方法可以找到)
ubuntu安裝openJDK
- 安裝方式其實很簡單, 輸入
sudo apt search openjdk
會看到好多openjdk
版本, 找到並復制openjdk-11-jdk
openjdk-11-jdk/focal,now 11.0.7+10-3ubuntu1 amd64 [已安裝] OpenJDK Development Kit (JDK)
- 輸入
sudo apt install openjdk-11-jdk
至此java環境安裝完畢 - 輸入
java -version
驗證下自己的java版本吧 - (這句代碼可以先不執行)執行命令
sudo apt-get install build-essential
准備下等下需要用到的工具
這里其實有個坑, 我們的ubuntu20默認安裝gcc版本過高了, 參考編譯文檔發現需要低於gcc7.4版本一下
下載openJDK源碼編譯
下載openJDK
- 訪問網址 openJDK所有版本都有
下載自己想要的openJDK源碼
完畢之后通過ftp上傳到我們的ubuntu
編譯openJDK
- 使用
unzip -q openjdk-11+28_src.zip
解壓出源碼 cd openjdk
- 執行
bash configure --enable-debug --with-jvm-variants=server
(這里我們使用的是默認64bit和fastdebug方式編譯jvm)
更多參數可以參考我從java高並發編程藝術
復制的圖片
執行上面那段shell指令后會發現錯誤, 不要怕看其中這句話:
You might be able to fix this by running 'sudo apt-get install autoconf'.
(1) 把sudo apt-get install autoconf -y
復制出來在shell上執行下
等待安裝完畢, 繼續使用
sudo bash configure --enable-debug --with-jvm-variants=server
不斷的測試
中途可能還會錯誤幾次, 沒關系繼續copy
比如我又遇到了這個錯誤
看到紅框框了指令了么?? 繼續復制粘貼 entry
(2) sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev
__ 你們看到的錯誤可能不一樣不要復制我的(都到自己編譯jvm的程度了,這點基本功你要會,我就不詳述了) __
(3) sudo apt-get install libcups2-dev
有遇到了,執行下, 回去繼續做檢測指令
(4) sudo apt-get install libfontconfig1-dev
(5) sudo apt-get install libasound2-dev
接着我發現全程正常編譯完畢...
那么我們可以正式開始編譯jvm了
make images -j 4
開始正式編譯, 最終會在終端中看到
或者
都代表編譯成功
這里筆者一邊看電視劇一邊編譯的, 沒注意到已經編譯完成, 認為編譯失敗, 又
make images
編譯了一回, 不過沒關系, 第二次編譯沒有clean掉已經編譯好的jdk, 所以速度很快
對了編譯期間會遇到, 無視就好
注: 某些輸入文件使用或覆蓋了已過時的 API。 注: 有關詳細信息, 請使用 -Xlint:deprecation 重新編譯。
至此我們編譯完成...