在ubuntu16下編譯openJDK11


為什么需要編譯自己的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

  1. 訪問網址 openJDK所有版本都有
    下載自己想要的openJDK源碼


完畢之后通過ftp上傳到我們的ubuntu

編譯openJDK

  1. 使用 unzip -q openjdk-11+28_src.zip 解壓出源碼
  2. cd openjdk
  3. 執行 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 重新編譯。

至此我們編譯完成...


免責聲明!

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



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