首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

手把手教你編譯 OpenJDK 7 源碼:從環境搭建到 HotSpot 運行調試

     編輯:Java 綜合教學

手把手教你編譯 OpenJDK 7 源碼:從環境搭建到 HotSpot 運行調試

深入理解 JVM 最佳路徑莫過於親自編譯運行 OpenJDK。本文記錄在 Ubuntu 12.04 上編譯 OpenJDK 7u 全過程:依賴安裝、環境變量配置、編譯執行、結果驗證、HotSpot 啟動、常見坑點解決,為 JVM 源碼探索鋪路。

一、準備工作

1. 獲取源碼

官方 OpenJDK 7u 源碼包:https://jdk7.java.net/source.html。下載解壓至工作目錄 (如 /usr/dev/jvm/openjdk)。

2. 系統需求

  • 作業系統:Linux (Ubuntu 12.04 測試) / macOS。Windows 需 Cygwin,坑多不推薦。
  • 硬件:建議 4GB+ 內存,50GB+ 磁盤,多核 CPU 加速編譯。

二、編譯環境配置 (關鍵步驟)

1. 安裝構建依賴

sudo apt-get update
sudo apt-get install build-essential gawk m4 libasound2-dev libcups-dev libxrender-dev \
    xorg-dev xutils-dev x11proto-print-dev binutils libmotif3 libmotif-dev ant \
    openjdk-6-jdk  # 或 Oracle JDK 6+,見下文關鍵說明

關鍵警告:務必使用 Oracle JDK 6/7 作為 Bootstrap JDK。OpenJDK 6 自身存在 Bug (符號 JVM_FindClassFromCaller 缺失) 會導致後續 HotSpot 運行失敗。本文踩坑後驗證:換用 Oracle JDK 徹底解決。

2. 環境變量配置 (/etc/profile)

export LANG=C
# Bootstrap JDK 路徑 (必須指向 Oracle JDK)
export ALT_BOOTDIR=/usr/lib/jvm/java-6-oracle
export ALT_JDK_IMPORT_PATH=/usr/lib/jvm/java-6-oracle

# 編譯目標選擇
export BUILD_LANGTOOLS=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true
# export BUILD_JAXWS=false  # 可選關閉
# export BUILD_JAXP=false
# export BUILD_CORBA=false

export SKIP_COMPARE_IMAGES=true
export BUILD_DEPLOY=false
export BUILD_INSTALL=false

# 輸出目錄 (建議在源碼內 build 目錄)
export ALT_OUTPUTDIR=/usr/dev/jvm/openjdk/build

export ALLOW_DOWNLOADS=true

# 必須取消這兩個,否則 sanity check 失敗
unset JAVA_HOME
unset CLASSPATH

3. 驗證環境

cd /usr/dev/jvm/openjdk
make sanity

輸出 Sanity check passed. 表示環境就緒。

三、開始編譯

make

預計耗時:30-60 分鐘 (視機器性能)。編譯過程會輸出詳細日志,正常結束顯示構建摘要。

四、查看編譯成果

cd build/j2sdk-image
bin/java -version

期望輸出:

openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-xxx)
OpenJDK Server VM (build xx.xx-bxx, mixed mode)

五、運行 HotSpot 虛擬機 (核心驗證)

1. 定位 HotSpot 輸出

路徑:build/hotspot/outputdir/linux_i486_compiler2/product/ (架構相關)。

2. 編輯環境腳本 (env.sh)

# 文件中已有 JAVA_HOME, CLASSPATH, HOTSPOT_BUILD_USER 等
# 必須添加庫路徑,否則啟動報錯
LD_LIBRARY_PATH=.:${JAVA_HOME}/jre/lib/i386/native_threads:${JAVA_HOME}/jre/lib/i386:
export LD_LIBRARY_PATH

3. 啟動 Gamma (HotSpot 解釋器) 驗證

. ./env.sh
./gamma -version

成功輸出 HotSpot 版本信息,標誌著完整編譯運行鏈路打通。

六、常見坑點與解決方案總結

問題現象根因解決方案
relocation error: symbol JVM_FindClassFromCaller not definedBootstrap JDK 用了 OpenJDK 6,其 libjava.so 依賴符號在 HotSpot 中缺失換用 Oracle JDK 6/7 作為 ALT_BOOTDIR
ERROR: Your JAVA_HOME environment variable is set (sanity 階段)環境變量 JAVA_HOME 干擾構建系統判斷unset JAVA_HOME 在 /etc/profile 中
CLASSPATH 干擾同理unset CLASSPATH
編譯中斷:缺少庫/頭文件構建依賴包未裝全補裝 libxrender-dev、libcups-dev 等,參考 README-builds.html
HotSpot 啟動:error while loading shared librariesLD_LIBRARY_PATH 未正確設置在 env.sh 添加 ${JAVA_HOME}/jre/lib/arch 路徑
64位系統編譯 32位目標失敗缺少 32位庫安裝 ia32-libs (Ubuntu 12.04) 或多架構支持包

七、進階:NetBeans 調試 HotSpot 源碼

  1. 安裝 NetBeans (支持 C/C++ 插件)
  2. 導入 HotSpot 源碼項目 (hotspot/src)
  3. 配置調試器:附加到 gamma 進程或直接啟動主類
  4. 斷點調試:類加載、JIT 編譯、GC、線程調度等核心流程

八、總結與後續探索方向

通過親手編譯運行 OpenJDK 7,我們:

  • 掌握了 JDK 構建系統、依賴鏈、環境隔離技巧
  • 打通了「源碼 → 二進制 → 運行驗證」完整鏈路
  • 解決了 Bootstrap JDK 選擇、符號缺失、庫路徑等經典工程化難題
  • 為後續深入研究奠基:類加載機制、即時編譯器 (C1/C2)、垃圾收集器 (G1/CMS)、線程模型、Java 語言特性實現

建議下一步:閱讀《深入理解 Java 虛擬機》配合源碼調試,專題攻克感興趣的 JVM 子系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved