1. 背景
想要一探JDK内部的实现机制,最便捷的路径之一就是自己编译一套JDK。
2. 获取JDK源码
从http://openjdk.java.net/下载源码,如 openjdk-6-src-b27-26_oct_2012.tar.gz
解压之后的目录结构:
3. 编译环境
3.1 系统环境
Ubuntu 12.04,64位
3.2 准备编译脚本
在openjdk根目录下面创建build.sh文件,内容为编译的设置和编译命令
build.sh
设置语言
export LANG=C
设置Bootstrap JDK
export ALT_BOOTDIR=/sdf/jvm/openjdk/jdk1.7.0_72
允许自动下载依赖
export ALLOW_DOWNLOADS=true
并行编译的线程数,设置为何CPU内核数量一致即可
export HOTSPOT_BUILD_JOBS=12
export ALT_PARALLEL_COMPILE_JOBS=12
export SKIP_COMPARE_IMAGES=true
使用预编译头文件,不加这个编译会更慢一些
export USER_PRECOMPILED_HEADER=true
设置要编译的内容
export BUILD_LANGTOOLS=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true
BUILD_DEPLOY=false
BUILD_INSTALL=false
编译结果所存放的路径
export ALT_OUTPUTDIR=/sdf/jvm/openjdk/build
unset JAVA_HOME
unset CLASSPATH
unset LD_LIBRARY_PATH
开始编译
make 2>&1 | tee $ALT_OUTPUTDIR/build.log
3.3 执行sh build.sh编译
在编译过程中有很多错误,只能说一步步解决。
下面列举我在编译过程中遇到的问题:
1. You Seem to not have installed ALSA 0.9.1 or higher
(1)清除系统原有的alsa模块
sudo apt-get remove linux-sound-base alsa-base alsa-utils
(2)重新安装alsa模块
sudo apt-get install xmlto libasound2-dev
sudo apt-get install linux-sound-base alsa-base alsa-utils
这是一类问题,基本就是缺少依赖,只要成功安装就可以了
具体参考:
https://blog.csdn.net/qq_29729577/article/details/53706551
http://cduym.iteye.com/blog/1892416
http://caoxudong818.iteye.com/blog/1748869
2.
解决方案:使用jdk1.7.0_72作为ALT_BOOTDIR
3.
https://blog.csdn.net/abountwinter/article/details/52369507
4. 编译成功
编译成功的结果:
编译的输出:
验证:
x.参考资料
深入理解Java虚拟机:JVM高级特性与最佳实践
https://blog.csdn.net/qq_29729577/article/details/53706551
http://cduym.iteye.com/blog/1892416
https://blog.csdn.net/abountwinter/article/details/52369507
http://caoxudong818.iteye.com/blog/1748869