深入理解JVM的爬坑之路--openjdk环境编译

Posted cherishsakura

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解JVM的爬坑之路--openjdk环境编译相关的知识,希望对你有一定的参考价值。

构建编译环境

在读本书时,为了更好的理解书上的源码,便开始了此段艰难的环境编译之路。

本文默认环境是Linux的Ubuntu 16.04 LTS,openJdk版本是14,书上给的网址直接下网速很坑,推荐在git上的地址下载

JDK14u链接

1. 安装基础环境

首先需安装GCC或CLang来进行编译,确保最低版本为GCC4.8 或者CLang 3.2 以上,安装GCC的命令为:

sudo apt-get install build-essential

编译过程中需要依赖FreeType,CUPS等若干第三方库,所依赖库在下列表格列出,执行对应安装命令即可。

工具 库名称 安装名称
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

2. 安装JDK

编译jdk 需要安装N-1的已经编译好的JDk,安装过程如下,由于需要编译openjdk14u,所以需要安装一下jdk13,官网下载

JDK官网

下载完成后,使用如下命令解压:

tar -xvf jdk-13.0.2_linux-x64_bin.tar.gz

将解压后的文件夹移动到/opt 目录

sudo mv jdk-13.0.2 /opt/

配置Java环境:

sudo tee /etc/profile.d/jdk13.0.2.sh <<EOF

export JAVA_HOME=/opt/jdk-13.0.2

export PATH=$PATH:$JAVA_HOME/bin

EOF

导出配置文件并检查Java命令:

source /etc/profile.d/jdk13.0.2.sh

若不想每次都在用jdk的时候先source一下,可以配置永久环境变量

sudo gedit ~/.bashrc

然后在文件末尾添加 source /etc/profile.d/jdk13.0.2.sh

然后查看java版本

java -version

3. 开始编译

首先先生成bash configure命令

bash configure --enable-debug --with-jvm-variants=server   // 编译FastDebug版,仅含Server模式的HotSpot虚拟机

configure 命令承担了依赖项检查、参数配置和构建输出目录结构等多项职责,如果编译过程中需要的工具链或者依赖项有缺失,命令执行后会得到明确的提示,并给出该依赖的安装命令。

完成后,执行

make all

注意,当目录结构产生后又修改了配置或者多次编译,必须先使用make clean和make dist-clean清理目录,才能确保新的配置生效。

4. 使用IDE调试源码

当然,作为一个标准型码农,只有能运行和跟踪调试程序才能是手握雷电,故而安装IDE来进行HotSpot源码调试。

本次使用的是 JetBrians的Clion,可直接在JetBrains官网下载,而且可以免费试用30天。

安装后,新建项目,选择”New CMake Project from Sources“ , 选择jdk14u下面的src/hotspot目录,然后点Ok,Clion会自动配置好CMake项目使用的CMakeLists.txt ,并且构建代码索引,符号表等。

加载后,添加一个新的configuration。如图
技术图片

点击Configure Custom Build Targets,点击add

技术图片

Name 设置成openjdk,点击Build 右边的 ... 图标,创建External Tools,

技术图片

点击左上角+,创建tool,name填make,Program填make,Working directory 选择openjdk的代码目录路径,点击确定,保存。

然后在如下界面,选择创建好的target。Executable选择build出来的jdk的java文件,即路径为 jdk14u/build/linux-x86_64-server-fastdebug/jdk/bin/java。Program arguments 暂时填一个-version。最后保存。

技术图片

然后运行debug

技术图片

IDE代码中大量红色提示

在查看源码的cpp文件,会发现有很多红色的提示,且无法跳转,解决如下:

修改CMakeLists.txt ,加上如下的几行,然后Reload changes,即可有效解决。

include_directories(share)
include_directories(../java.base/unix/native/include)
include_directories(../java.base/share/native/include)
include_directories(../../build/linux-x86_64-server-fastdebug/jdk/include)
include_directories(../../build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc)
include_directories(../../build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc/jvmtifiles)
小结

深入理解Java虚拟机关于IDE编译有点泛,这边参考了 刘正阳大佬的 博客,本文后半部分的Clion 配置调试都参考于此篇博客,

手把手教你构建、debug、开发Java虚拟机

虽然坎坷,但跌跌撞撞敲开了JVM的大门,抛砖引玉,还请各位大佬不吝赐教。


以上是关于深入理解JVM的爬坑之路--openjdk环境编译的主要内容,如果未能解决你的问题,请参考以下文章

JVM-Ubuntu18.04.1下编译OpenJDK8

深入理解Java虚拟机(JVM高级特性与最佳实践)读后感

深入浅出-JVM:编译 jdk

vue的爬坑之路之----IOS:Safari不兼容Javascript中的Date问题

vue的爬坑之路之----基于vue-cli 无限滚动插件无限加载

JVM OpenJDK1.8源码在Ubuntu16.04下的编译