深入理解Java虚拟机之自己编译JDK

createh51周前 (12-22)技术教程11

题外话

最近在阅读《深入理解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 准备:

  • OpenJDK11sudo apt-get install openjdk-11-jdk

开始编译

编译FastDebug版,仅含Server模式的HotSpot虚拟机命令:

bash configure --enable-debug --with-jvm-variants=server

# 嫌写那么多麻烦,直接用下面这个:point_down:,不过这个是生成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

原文链接:https://www.cnblogs.com/Zhouge6/p/15781939.html?utm_source=tuicool&utm_medium=referral

相关文章

Java基础 - javac命令详解之编译 如何使用javac命令编译

1.为什么要搞定 javac 命令1.javac 是java中的编译源代码的命令工具,将.java文件编译成 .class 文件;2.由于当下为了提高开发效率,大多数的开发工作都在 java的 集成开...

阿里P8大牛耗费三年整理的:Java架构之完美设计实战PDF

前言做学问就像爬山,从山脚出发的人很多,能爬到山顶的却寥寥无几。有些人爬得很快,到达半山腰就盖了一所房子住在那里,对爬向山顶没有太大的兴趣。而能够登顶的人,除了要具备必要的技能外,更要有坚强的毅力,不...

Java 代码编译的3种方式,其中JIT最重要!

通过 Javac 将程序源代码进行编译,转换成 Java 字节码,JVM 通过模板方式把字节码翻译成对应的机器指令,逐条读入,逐条解释翻译,执行速度必然比可执行的二进制字节码程序慢得多。为了提高执行速...

Java 21:有什么新变化? java近几年发展变化

【CSDN 编者按】这篇文章详细介绍了Java 21 的新特性和改进。Java 21是新的长期支持(LTS)版本,其中包括了15个Java增强提案(JEPs)。其中最重要的特性之一是虚拟线程的最终化,...

9000字,通俗易懂的讲解下Java注解

对于Java注解,我咨询过一些身边的人,很多人表示:知道怎么用,不熟悉不知道你是不是这样?在我没有系统性的学习一边注解的时候,我也是如此,在我花时间学习过注解之后,我觉得,对于注解,最重要的在于理解,...

阿里巴巴Java性能调优实战:深入JVM即时编译器JIT,优化Java编译

深入JVM即时编译器JIT,优化Java编译然而许多 Java 开发人员对 JIT 编译器的了解并不多,不深挖其工作原理,也不深究如何检 测应用程序的即时编译情况,线上发生问题后很难做到从容应对。类编...