前言
想要窥探Java虚拟机内部的实现原理,最直接的一个方式就是编译一套自己的JDK,通过阅读源码和打断点调试跟踪JDK源码来了解java的运作体系,虽然这样做门槛可能会高点,但总归比看各种各样的书籍更加贴近问题本质,刚开始我也觉得头大,万事开头难,迈出第一步之后,回过头看,其实很简单,很符合直觉和逻辑。
系统资料
编译前
安装工具&依赖
Xcode
Xcode command line tools
xcode-select --install
X11
安装x11,地址https://www.xquartz.org/
安装完之后,链接
ln -s /opt/X11/include/X11 /usr/local/include/X11
加速编译工具ccache
brew install ccache
依赖的一个字体库 freetype
brew install freetype
boot jdk
要编译版本号为N的openJdk,至少要需要一个版本为N-1的的已经编译好的jdk,因此,需要安装好一个版本至少是11的jdk。
获取源码&切分支
从github上clonejdk的源码 ,然后cd到该目录,checkout tag为jdk8-b80的版本作为本地分支openjdk8
git clone https://github.com/openjdk/jdk
git checkout -b openjdk12+31 jdk-12+31
编译
配置
Running Configure
指定boot-jdk为jdk11所在目录
sh configure --with-debug-level=slowdebug --with-boot-jdk=/Users/macbook/DevTools/JDK11/jdk-11.0.8.jdk/Contents/Home
配置成功
编译问题列表(针对 jdk-12+31分支)
缺少逗号
第一处
jdk/test/hotspot/gtest/logging/logTestUtils.inline.hpp
第二处
jdk/test/hotspot/gtest/logging/test_logFileOutput.cpp
图片中^位置加上逗号即可
类型问题
修改为下图所示
jdk/src/hotspot/share/runtime/sharedRuntime.cpp
字符串定义问题
改为
jdk/src/hotspot/share/runtime/arguments.cpp
赋值问题
jdk/test/hotspot/gtest/classfile/test_symbolTable.cpp
注释掉s1=s1这行
Xcode13 兼容性问题
问题1
修改
jdk/src/java.base/unix/native/libjava/ProcessImpl_md.c
问题2
改
jdk/src/java.desktop/macosx/native/libjsound/PLATFORM_API_MacOSX_MidiUtils.c
少括号
改
jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CSystemColors.m
编译成功
修改完上述问题后,执行make images ,如果问题没有一次性修复完,每次修复完执行make images之前执行一次make clean,如果遇到其它问题,因为不同软件版本特别是xcode版本不同问题可能不同,可以到https://github.com/openjdk/jdk上对比最新代码,或者查看出问题代码所在文件的历史记录追寻问题原因。