深入理解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),字节码 ...
随机推荐
- MySQL数据库如何实现增量备份
1 .通过SHOW VARIABLES LIKE '%log_bin%';查看数据库是否开启增量备份log_bin=ON则为开启log_bin=OFF则为关闭 2 .修改mysql配置文件mysql. ...
- c++和c中const的区别
const在c与c++的区别与使用 大学期间对c和c++的了解太少了,现在工作了导致自己来恶补,简单的const关键字里面的学问还是挺大的,越是基础的知识越是容易忘却,所以今天开始记录着自己每一天的学 ...
- [ZJCTF 2019]EasyHeap | house of spirit 调试记录
BUUCTF 上的题目,由于部分环境没有复现,解法是非期望的 house of spirit 第一次接触伪造堆的利用方式,exp 用的是 Pwnki 师傅的,本文为调试记录及心得体会. 逆向分析的过程 ...
- tryParse的用法。
tryParse的用法. int.Parse()是一种类容转换:表示将数字内容的字符串转为int类型.如果字符串为空,则抛出ArgumentNullException异常:如果字符串内容不是数字,则抛 ...
- py常用标准库
functools python3中增加了更多工具函数,做业务开发时大多情况下用不到,记录一个比较常用的,给函数或者对象初始化参数 partial函数(偏函数) 把一个函数的某些参数设置默认值,返回一 ...
- java web 404错误页面配置
java web 404错误页面配置:注意红框的地方,在工程的web.xml文件里的最开头加入如下的内容便可,但是也有问题,针对以.action后缀名和.jsp后缀名不起作用, 因为后面配置了一些拦截 ...
- 安装选择msi格式还是zip(windows下Nodejs zip版下载安装及环境变量配置)
安装选择msi格式还是zip((windows下Nodejs zip版下载安装及环境变量配置)) -----以node.js 安装为例: 1,外观对比: ✿ 简单介绍一下node的作用: • node ...
- 【LeetCode】1162. 地图分析 As Far from Land as Possible(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 这个题想考察什么? 剩下的任务就是套模板! 日期 题目 ...
- 【LeetCode】386. Lexicographical Numbers 解题报告(Python)
[LeetCode]386. Lexicographical Numbers 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...
- 【剑指Offer】二叉搜索树与双向链表 解题报告(Python)
[剑指Offer]二叉搜索树与双向链表 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interview ...