000-OpenJDK17 源码构建:MacOS环境(M芯片)

文章来源声明: 原文作者:灰蒙蒙到清澄澄; 来源站点:掘金; 原文链接:https://juejin.cn/post/7697558686809800739; 本文基于上述来源整理/加工,觅优补充点评,仅供技术学习交流。版权归原作者所有。
觅优短评

适合想深入 JVM 源码的开发者,按文操作可快速在 Apple Silicon 上搭好可断点调试的 slowdebug 环境,少走构建弯路。

一、前置工作 ------

1.1 下载源码

GitHub上下载源码到本地:github.com/openjdk/jdk…

image.png

注:若没有说明,以下操作皆在在master分支下,项目根目录执行命令。

1.2 源码目录

源码目录结构如下,其中重点观察 src/hotspot/ 目录即可,该目录是虚拟机 hotspot 的核心实现

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/           # 通用数据结构和工具
└── ...

image.png

二、构建源码

hotspot是用C和C++混合写的项目。JDK自己提供了一套构建流程。

我们在做Java项目时,会使用maven构建项目,最终生成jar包丢到生产环境运行。而openjdk17也是一个项目,只不过是C和C++混合写的项目,构建这个项目的产物就是JDK环境,即java命令就是该项目的构建产物。构建产物可以分为3个版本:

  1. release版本,即我们平时去Oracle官网下载的JDK环境,可以运行在生产环境的版本,有大量编译优化,没有调试语句。
  2. fastdebug版本,保留重要的调试检查,但开启了编译器优化,只适合普通的调试。
  3. slowdebug版本,关闭所有优化,最适合调试JVM源码的版本。

为了研究源码可以顺利打上断点,我们构建slowdebug版本做示例。在MacOS环境(M芯片)直接按照如下步骤进行构建即可。

2.1 构建步骤

# 构建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命令哦。

image.png

单步调试Demo

下面演示如何调试 java -version 命令在源码内部如何运行的。

  1. 新建build target

image.png

image.png

  1. 配置执行命令

image.png

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

image.png