想要窥探Java虚拟机内部的实现原理,最直接的一个方式就是编译一套自己的JDK,通过阅读源码和打断点调试跟踪JDK源码来了解java的运作体系,虽然这样做门槛可能会高点,但总归比看各种各样的书籍更加贴近问题本质,刚开始我也觉得头大,万事开头难,迈出第一步之后,回过头看,其实很简单,很符合直觉和逻辑。
系统资料 编译前 安装工具&依赖 Xcode Xcode command line toolsxcode-select --installX11
安装x11,地址https://www.xquartz.org/
安装完之后,链接
ln -s /opt/X11/include/X11 /usr/local/include/X11加速编译工具ccache
brew install ccache依赖的一个字体库 freetype
brew install freetypeboot 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上对比最新代码,或者查看出问题代码所在文件的历史记录追寻问题原因。



