一、为什么要自己编译JDK源码

想要窥探Java虚拟机内部的实现原理,最直接的一条路径就是编译一套自己的JDK,通过阅读和 跟踪调试JDK源码来了解Java技术体系的运作。了解技术的本质,提高自己的职场竞争力

二、openjdk和jdk的的联系区别

从java发展史中我们知道,openjdk是sun公司在2006年年末把Java开源而形成的项目,,例如OracleJDK、Oracle OpenJDK、AdoptOpenJDK、Azul Zulu、SAP SapMachine、Amazon Corretto、IcedTea、UltraViolet等 都是从OpenJDK源码衍生出的发行版,两者共用了绝大部分相同的代码,所以我们编译的OpenJDK,基本上可以认 为性能、功能和执行逻辑上都和官方的OracleJDK是一致的。

三、系統需求

查阅了相关资料,了解到在windows下编译是件很痛苦的过程,所以选择了虚拟机安装。

在VMware® Workstation 15 Pro中安装Ubuntu 18.04 LTS,。在官方 文档上要求编译OpenJDK至少需要2~4GB的内存空间(CPU核心数越多,需要的内存越大),而且 至少要6~8GB的空闲磁盘空间,由于本人电脑配置比较低,只分配了4g内存,1核心数,40Gb的硬盘空间

四、获取OpenJDK源码

获取OpenJDK源码有两种方式。一是通过Mercurial代码版本管理工具从Repository中直接取得源码(Repository地址:https://hg.openjdk.java.net/jdk/jdk12),这种方式因为仓库没有国内的CDN节点,访问速度实在是太慢,这里就不介绍了。

我们采取第二种方式,即直接在仓库中打包出源码压 缩包,再进行下载。

对系统环境的最后一点建议是,所有的文件,包括源码和依赖项目,都不要放在包含中文的目录 里面,这样做不是一定会产生不可解决的问题,只是没有必要给自己找麻烦。

1.进入https://hg.openjdk.java.net/jdk/jdk12/ 然后点击左边菜单中的“Browse”,将显示下图源码根目录页面。点击gz,此时默认代码下载到/home/user/Downloads/目录下面。

2.我在上面网站下载得文件只有1m多大小(文件不全,无法解压),如果一样的情况可以在下面链接下载,完整的源码包我已经上传到csdn了。

https://download.csdn.net/download/weixin_38087538/12305262

我下载的OpenJDK 12源码包大小为 171MB,解压之后约为579MB。

 

3.执行解压命令

 tar zxvf jdk12-06222165c35f

4.在Ubuntu系统上安装GCC命令 

5.在编译过程中需要依赖FreeType、CUPS等若干第三方库,OpenJDK全部的依赖库如下

sudo apt-get install libfreetype6-dev

sudo apt-get install libcups2-dev

sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev

sudo apt-get install libasound2-dev

sudo apt-get install libffi-dev

sudo apt-get install autoconf

6.最后,假设要编译大版本号为N的JDK,我们还要另外准备一个大版本号至少为N-1的、已经编译 好的JDK,这是因为OpenJDK由多个部分(HotSpot、JDK类库、JAXWS、JAXP……)构成,其中一 部分(HotSpot)代码使用C、C++编写,而更多的代码则是使用Java语言来实现,因此编译这些Java代 码就需要用到另一个编译期可用的JDK,官方称这个JDK为“Bootstrap JDK”。编译OpenJDK 12时, Bootstrap JDK必须使用JDK 11及之后的版本。在Ubuntu中使用以下命令安装OpenJDK 11:

sudo apt-get install openjdk-11-jdk

五、进行编译

编译FastDebug版、仅含Server模式的HotSpot虚拟机(在/software/openjdk/jdk12-06222165c35f/ 下执行编译检查)

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

configure命令承担了依赖项检查、参数配置和构建输出目录结构等多项职责,如果编译过程中需 要的工具链或者依赖项有缺失,命令执行后将会得到明确的提示,并且给出该依赖的安装命令,这比 编译旧版OpenJDK时的“make sanity”检查要友好得多,譬如以下例子所示:

 如果编译工程中工具链或依赖项有缺失,执行命令后会得到明确提示,并且会给出该依赖的安装命令。安装过程中可能会遇到"sudo apt-get install libfontconfig-dev"的命令,复制它回车,再把”bash configure --enable-debug --with-jvm-variants=server“命令重新执行一遍

如果一切顺利的话,就会收到配置成功的提示,并且输出调试级别,Java虚拟机的模式、特性, 使用的编译器版本等配置摘要信息,如下所示:


2.依赖检查通过后便可以输入“make images”执行整个OpenJDK编译了,这里“images”是“productimages”编译目标(Target)的简写别名,这个目标的作用是编译出整个JDK镜像,除了“productimages”以外,其他编译目标还有:
 

hotspot:只编译HotSpot虚拟机 
hotspot-<variant>:只编译特定模式的HotSpot虚拟机 
docs-image:产生JDK的文档镜像 
test-image:产生JDK的测试镜像 
all-images:相当于连续调用product、docs、test三个编译目标 
bootcycle-images:编译两次JDK,其中第二次使用第一次的编译结果作为Bootstrap JDK clean:清理make命令产生的临时文件 
dist-clean:清理make和configure命令产生的临时文件

 

3.make images编译完成后目录结构如下

编译比较耗时,本人配置为 Workstation 15 +Ubuntu 18.04 LTS 1核心 4gb内存 40gb硬盘编译1个小时左右

编译完成之后,进入OpenJDK源码的“build/配置名称/jdk”目录下就可以看到OpenJDK的完整 编译结果了,把它复制到JAVA_HOME目录,就可以作为一个完整的JDK来使用。

4.在/software/openjdk/jdk12-06222165c35f/build/linux-x86_64-server-fastdebug/jdk/bin下查看java版本

java -version

 

六、在CLion中调试OpenJDK源码

 1.去JB公司官网下载CLion,此时默认代码下载到/home/user/Downloads/目录下面。

        https://www.jetbrains.com/clion/download/#section=linux

 2.执行解压命令

       tar zxvf CLion-2019.3.2.tar.gz

3.在/home/kai/Downloads/jdk12-06222165c35f目录下建立CMakeLists.txt文件

粘贴

cmake_minimum_required(VERSION 3.15.3)
 
project(jdk12-06222165c35f)
 
file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h")
 
add_executable(jdk12-06222165c35f ${SOURCE_FILES})

保存退出

4.打开CLion导入OpenJDK源码

cd home/kai/Downloads/clion-2019.3.2/bin

./clion.sh

 

 

在Run/Debug Configurations中增加一个CMake Appliaction   Executable选择的是/home/kai/Downloads/jdk12-06222165c35f/build/linux-x86_64-server-fastdebug/jdk/bin/java ,运行参数-version,再把Before lunch里面的Build去掉,就可以调试了。
配置完成后HotSpot启动执行入口是java.c的JavaMain()方法,读者可以断点调试。

 


 


 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐