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

一、前置工作

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个版本:

  1. release版本,即我们平时去Oracle官网下载的JDK环境,可以运行在生产环境的版本,有大量编译优化,没有调试语句。
  2. fastdebug版本,保留重要的调试检查,但开启了编译器优化,只适合普通的调试。
  3. 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 命令在源码内部如何运行的。

  1. 新建build target
  1. 配置执行命令
  1. 在 src/hotspot/share/adlc/main.cpp 文件中找到main函数,这是jvm最初的入口。在main函数处打上断点,运行程序。
相关推荐
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 百度人脸识别入门案例
java·百度·交友
来福猿1 小时前
SpringCloud Config 源码分析:配置拉取、刷新与多环境管理
后端·spring·spring cloud
wuminyu2 小时前
JMM学习总结:深入理解happens-before关系
java·linux·c语言·jvm·c++
电商API_180079052472 小时前
反向海淘多币种结算:汇率该在哪个时点被冻结
java·开发语言·数据库·跨境电商·1688 api
开开心心就好3 小时前
多份文档怎么批量打印?支持多种格式
java·服务器·开发语言·pdf·ocr·散列表·启发式算法
Pniubi3 小时前
模拟一个充值送token怎么保证幂等?一致性?原子性?
java
企业数字化笔记3 小时前
多租户配额怎么控制?用量口径、并发预留与超额处理的实现方法
java·数据库·spring boot
IT_陈寒3 小时前
React组件莫名重渲染?你可能忘了这个小细节
前端·人工智能·后端
巴勒个啦4 小时前
Prompt Engineering 实战:5 个让 AI 生成生产级业务代码的工程模式
java·前端