前言
作为一个JAVA开发人员,在面试过程中无数次被问到JVM内存模型,垃圾回收机制相关问题(基本都会被虐 因为长久以来JVM对于我来说都是个黑盒 ),要想对这些问题有更深入的了解就得学习下HotSpot源码看看jvm的庐山真面目
开始尝试在Window上编译OpenJDK,尝试几次没有成功,后面就在Liunx系统上编译调试了,这里记录下流程
首先说下编译相关的工具跟JDK
操作系统 | centos8.5 | gcc 默认版本是 8.5.0 因为编译的OpenJDK要求gcc版本有点高 |
jdk | 11.0.17 | 编译OpenJDK需要一个jdk |
OpenJDK | openjdk-jdk-12+13 | 编译OpenJDK需要系统里面配置有JDK一般要低一个版本 |
Clion | clion-2020.3.4 | C++开发工具 |
整个编译过程主要有下面几个过程,其中编译过程比较耗时 后面逐步介绍每一步的过程
一、配置JDK
- 上传JDK并解压
- 在
/etc/profile
配置文件中设置JDK环境 执行source /etc/profile
使配置生效
这样系统里面的JDK就设置了11的版本
JAVA_HOME=/home/dlh/jdk-11.0.17
CLASSPATH=$JAVA_HOME/lib
PATH=$JAVA_HOME/bin:$PATH
export PATH JAVA_HOME CLASSPATH
这里是/etc/profile
加的配置
二、编译OpenJDK
前面已经配置好了JDK环境 解析来我们来编译OpenJDK
-
上传 OpenJDK 并解压(OpenJDK我是从链接: 码云国内镜像这里下载的,比较快点)
-
进入OpenJDK 执行./configure 命令
这里要加上 --disable-warnings-as-errors 目的是不然后面的编译警告导致编译失败
另外执行这个命令有一个报错bash: ./configure: Permission denied
给他赋上执行权限就好了chmod 777 configure
加上权限后再执行 configure命令
还是报错,提升我们要install其它依赖 (那就安装呗~)
安装提示 执行 yum install autoconf
还是失败 报了这个提示 :
Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
网上找到了答案 具体看这里 Centos8 install失败原因
配置先阿里的镜像再执行install
配置玩阿里的镜像后再安装前面提示缺的依赖组件
安装提示install完缺失的组件后出现下面的提示
这就代表configure
命令执行完了
- 解析来执行make命令开始编译(
make all COMPILER_WARNINGS_FATAL=false
)
编译时间有点长,我这边大概花了50分钟(跟机器配置也有关系)
可以看到已经有build目录了编译成功
三、Clion调试OpenJDK
接下来 我们用Clion来调试OpenJDK
先上传开发工具到环境上
打开工具要图形化界面,这个就不能在Xshell上操作了,直接在虚拟机图形化界面操作
进入clion 的bin目录下面 执行启动脚本
等项目加载完
断点调试的话需要配置两个地方,这里先贴下最终的调试结果
有两个地方需要配置(Custom Build Targets 跟 MakeFile Application)
- Custom Build Targets 配置(后面的 MakeFile Application 配置要用到)
要配置这些 ,下面是配置好
配置项 | 配置的值 |
---|---|
Program | make |
Arguments | CONF=macosx-x86_64-normal-server-slowdebug |
Working directory | JDK安装的主目录 |
保持 ,到这里Target就配置好了
- MakeFile Application 配置
这里直接贴上前面配置好的截图
在 java.c 文件 JavaMain处打上断点
进入断点后就可以跟踪调试 了
让流程跑完 ,控制台打印了正确日志,到此 Liunx编译调试OpenJDK的环境就搭建好了
总结
建议直接在Liunx系统下编译调试 相对Windows系统容易些
另外 搭建调试环境只是深入了解JVM的第一步,要想真正了解JVM底层运行机制 还是得对C、C++有一定的掌握,计算机基础方面的知识也是必不可少的,看起来并不那么容易 慢慢学吧~~