一、前置工作
1.1 下载源码
GitHub上下载源码到本地:github.com/openjdk/jdk...

注:若没有说明,以下操作皆在在master分支下,项目根目录执行命令。
1.2 源码目录
源码目录结构如下,其中重点观察 src/hotspot/ 目录即可,该目录是虚拟机 hotspot 的核心实现
bash
src/hotspot/
├── cpu/ # CPU 架构相关代码
├── os/ # 操作系统相关代码
├── os_cpu/ # 操作系统与 CPU 架构的组合适配
├── share/ # 大部分跨平台的 HotSpot 核心实现
│ ├── classfile/ # 类加载、Class 文件解析
│ ├── code/ # 机器码及代码缓存
│ ├── compiler/ # JIT 编译器
│ ├── gc/ # 垃圾收集器
│ ├── interpreter/ # 字节码解释器
│ ├── memory/ # 内存管理、元空间等
│ ├── oops/ # JVM 对象及元数据模型
│ ├── prims/ # JVM/JNI 等本地接口实现
│ ├── runtime/ # JVM 运行时基础设施
│ ├── services/ # JVM 管理与诊断服务
│ └── utilities/ # 通用数据结构和工具
└── ...

二、构建源码
hotspot是用C和C++混合写的项目。JDK自己提供了一套构建流程。
我们在做Java项目时,会使用maven构建项目,最终生成jar包丢到生产环境运行。而openjdk17也是一个项目,只不过是C和C++混合写的项目,构建这个项目的产物就是JDK环境,即java命令就是该项目的构建产物。构建产物可以分为3个版本:
- release版本,即我们平时去Oracle官网下载的JDK环境,可以运行在生产环境的版本,有大量编译优化,没有调试语句。
- fastdebug版本,保留重要的调试检查,但开启了编译器优化,只适合普通的调试。
- slowdebug版本,关闭所有优化,最适合调试JVM源码的版本。
为了研究源码可以顺利打上断点,我们构建slowdebug版本做示例。在MacOS环境(M芯片)直接按照如下步骤进行构建即可。
2.1 构建步骤
shell
# 构建slowdebug版本
# 步骤1. 清理(可选,如果之前构建过)
make CONF=macosx-aarch64-server-slowdebug clean
# 步骤2. 配置
bash configure --with-debug-level=slowdebug --disable-warnings-as-errors
# 步骤3. 生成 compile-commands.json 文件
make CONF=macosx-aarch64-server-slowdebug compile-commands
# 步骤4. 编译产物
make CONF=macosx-aarch64-server-slowdebug images
参数解释
- 步骤2中的
--disable-warnings-as-errors的作用是:关闭"编译器警告按错误处理"的机制,允许构建过程中出现警告,但不因为这些警告而直接导致构建失败。 警告仍然会显示。 - 步骤3中的compile-commands.json文件是为了能够在CLion这种IDE中,可以通过鼠标点击跳转到方法/类的实现。对编译非必要步骤,但却极大方便了程序调试。
- 步骤4为构建全量源代码。
执行完步骤4后构建产物如下,macosx-aarch64-server-slowdebug/jdk/bin/ 目录下,就是你熟悉的java、javac命令哦。

单步调试Demo
下面演示如何调试 java -version 命令在源码内部如何运行的。
- 新建build target


- 配置执行命令

- 在
src/hotspot/share/adlc/main.cpp文件中找到main函数,这是jvm最初的入口。在main函数处打上断点,运行程序。
