深入理解Java虚拟机之自己编译JDK
题外话
最近在阅读《深入理解Java虚拟机》,其中有一小节实战是自己编译JDK,实际操作下来后遇到问题不少,为此特地记录,也希望可以给大家带来一些参考!
前置准备
平台及工具:Windows 10 + WSL(ubuntu 20.04) + CLion(2021.2.2)
OpenJDK12下载地址:https://hg.openjdk.java.net/jdk/jdk12/
- 下载安装解压即可

编译工具版本推荐:
GCC 7.4及以上# Ubuntu上安装GCC命令,该命令默认安装9.3版本(2021年)
sudo apt-get install build-essential
编译依赖库:
| 工具 | 库名称 | 安装命令 |
|---|---|---|
| FreeType | The FreeType Project | sudo apt-get install libfreetype6-dev |
| CUPS | Common UNIX Printing System | sudo apt-get install libcups2-dev |
| X11 | X Window System | sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev |
| ALSA | Advanced Linux Sound Architecture | sudo apt-get install libasound2-dev |
| libffi | Portable Foreign Function Interface Library | sudo apt-get install libffi-dev |
| Autoconf | Extensible Package of M4 Macros | sudo apt-get install autoconf |
Bootstrap JDK 准备:
OpenJDK11
sudo apt-get install openjdk-11-jdk
开始编译
编译FastDebug版,仅含Server模式的HotSpot虚拟机命令:
bash configure --enable-debug --with-jvm-variants=server
# 嫌写那么多麻烦,直接用下面这个,不过这个是生成release版本的,不利于debug
bash configure
configure命令会进行依赖项检查,参数配置和构建输出目录结构等操作,所以依赖缺失会得到明确提示:

ZIP安装命令:
sudo apt-get install zip
继续检查...继续安装缺失的依赖...

成功界面:

依赖检查通过后,执行make images命令执行整个OpenJDK的编译,作用是编译出整个JDK镜像
不出所料,编译报错:

充分利用了搜索引擎,以及认真阅读了building.md文件后,发现应该是gcc的版本问题,默认安装的是9,但实际需要的是7,于是把9给卸载了,重新安装了个7
# 卸载命令
sudo apt-get remove gcc-9
# 安装7
sudo apt-get install gcc-7
sudo apt-get install g++-7
# 如果上述命令安装后,gcc --version能查出版本而不会报错,就无需使用以下命令
# 或者已有7和9两个版本,但默认用的是9,也可用以下命令修改为7
# 设置默认选项
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
sudo update-alternatives --config gcc
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100
sudo update-alternatives --config g++

万事俱备只欠东风。先make dist-clean清理一波编译生成的临时文件,接着一波流:
bash configure --enable-debug --with-jvm-variants=server
make images
漫长的等待后...没有报错!!!
测试一波:
./build/*/images/jdk/bin/java -version
编译成功:

目录结构:

在IDE工具上调试
导入JDK源码文件,open file 选择MakeFile,有弹窗清除clean,然后一直确认即可

等待导入......
接着会发现帮你生成了一堆的targets,将根目录Mark Directory as 一下

然后选all即可,打开编辑,Executable选择编译出来的java命令,Before launch移除Build
具体设置各项参数如图:

找到java.c文件,打个断点,直接Debug启动(开始你的表演):

配置-version只是测试一下是不是真的能够调试了而已,如果想要调试某个Java类呢

IDEA配合Clion远程调试
IDEA配置
- 添加Configuration,选择Remote JVM Debug即可:

Clion配置
添加Configuration,选择Custom Build Configuration
Target 需要添加一下,
make编译配置

make clean配置

Executable依然选择编译出来的Java命令
Program arguments填写:
-jar
-Xdebug
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5008
xxx.jar
Working directory选择:上述jar包生成位置
最终配置如图:

参考资料
《深入理解Java虚拟机:JVM高级特性与最佳实践》(第三版)1.6实战:自己编译JDK
深入理解Java虚拟机之自己编译JDK的更多相关文章
- 深入理解Java虚拟机 #01# 自己编译JDK
x 首先用书上的脚本尝试,失败. 之后根据源文件的 README 编译,抛出: root@linux:/opt/openjdk# sh ./get_source.sh ERROR: Need init ...
- 深入理解Java虚拟机(程序编译与代码优化)
文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...
- 深入理解Java虚拟机(九)——后端编译与优化
即时编译器 Java程序最初都是通过解释器进行执行,当发现某个方法或者代码块被运行得非常频繁,这些代码就被认为是热点代码,为了提高这些代码得运行效率,虚拟机会把热点代码编译成本地机器码,并进行优化,运 ...
- 《深入理解java虚拟机》学习笔记之编译优化技术
郑重声明:本片博客是学习<深入理解Java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序员有一个共识,以编译方式执行本地代码比解释方式更快,之所以有这样的共识,除去虚拟机解释 ...
- 《深入理解java虚拟机》学习笔记之虚拟机即时编译详解
郑重声明:本片博客是学习<深入理解java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块 ...
- 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具
上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...
- 《深入理解 java虚拟机》学习笔记
java内存区域详解 以下内容参考自<深入理解 java虚拟机 JVM高级特性与最佳实践>,其中图片大多取自网络与本书,以供学习和参考.
- (1) 深入理解Java虚拟机到底是什么?
好文转载:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机 作为一个Java程序员,我们每天都在写Java ...
- 深入理解java虚拟机【Java Class类文件结构】
Java语言从诞生之时就宣称一次编写,到处运行的跨平台特性,其实现原理是源码文件并没有直接编译成机器指令,而是编译成Java虚拟机可以识别和运行的字节码文件(Class类文件,*.class),字节码 ...
随机推荐
- [源码解析] PyTorch 分布式(17) --- 结合DDP和分布式 RPC 框架
[源码解析] PyTorch 分布式(17) --- 结合DDP和分布式 RPC 框架 目录 [源码解析] PyTorch 分布式(17) --- 结合DDP和分布式 RPC 框架 0x00 摘要 0 ...
- CF1099A Snowball 题解
Content 有一个重量为 \(w\) 的雪球从高度为 \(h\) 的位置开始滚落,每秒它的高度会减少 \(1\),同时在高度为 \(i\) 的位置它的重量会增加 \(i\).在雪球滚动的路线上还有 ...
- SpringBoot整合mybatis-plus并实现代码自动生成
1.引入maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...
- Windows c(++)获取磁盘剩余容量
头文件 #include <windows.h> #include <wtypes.h> 函数 GetDiskFreeSpaceExA 获取剩余可用空间 /// 得到盘符, 例 ...
- 【LeetCode】379. Design Phone Directory 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数组 日期 题目地址:https://leetcode ...
- 【LeetCode】1170. Compare Strings by Frequency of the Smallest Character 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双重循环 日期 题目地址:https://leetc ...
- 【九度OJ】题目1124:Digital Roots 解题报告
[九度OJ]题目1124:Digital Roots 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1124 题目描述: T ...
- 【LeetCode】700. Search in a Binary Search Tree 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcod ...
- CSS实现鼠标移入时图片的放大效果以及缓慢过渡
transform:scale()可以实现按比例放大或者缩小功能. transition可以设置动画执行的时间,实现缓慢或者快速的执行动画,效果图如下: 源码: <!DOCTYPE html&g ...
- CS5265低成本替代RTD2172|CS5265替代兼容RTD2172|替代RTD2172
瑞昱RTD2172是TYPEC转HDMI4K60HZ音视频数据转换器芯片.CS5265可以替代兼容RTD2172,除了实现同等的转换功能外且整体方案成本和性价比方面比RTD2172要高,且外围器件较少 ...