对于希望深入了解 JVM 的结构,工作原理以及调优的工程师来说,拥有自己的,从源码编译的 JVM 是非常必要的。本文描述如何在 Ubuntu 系统环境中编译 Open JDK 8。

设置环境

因为 JDK 主要使用 c++ 语言进行编写的,所以我们需要首先安装 c++ 开发环境

1
sudo apt install build-essential

安装 openjdk 的依赖包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo apt-get install -y  \
zip \
unzip \
ccache \
cpio \
curl \
libx11-dev \
libxext-dev \
libxrender-dev \
libxtst-dev \
libxt-dev \
libcups2-dev \
libfreetype6-dev \
libasound2-dev \
libelf-dev \
gdb

在 Open JDK 8中,有部分代码是用 Java 语言写成的,因此要完成编译,还需要安装一个: jdk。 在 open jdk 的源代码中把这个 JDK 叫做: Boot JDK。 这里我们选择安装 open jdk 7 的官方编译版本。

1
sudo apt install openjdk-7-jdk

下载源代码

1
wget https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41-src-b04-14_jan_2020.zip

下载以后,使用 unzip 命令简单的解压即可。

1
unzip openjdk-8u41-src-b04-14_jan_2020.zip

配置并编译

进入解压以后的目录(名为: openjdk),然后检查环境是否已经准备好并配置相关路径, 这个可以通过 CMake 的 Configure 完成,执行下面的命令:

1
bash ./configure --with-debug-level=slowdebug --with-target-bits=64 --with-freetype-include=/usr/include/freetype2 --with-freetype-lib=/usr/lib/x86_64-linux-gnu

系统会执行很多检查并生成相应的配置文件,如果没有错误,系统将显示类似下面的信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
......
Configuration summary:
* Debug level: slowdebug
* JDK variant: normal
* JVM variants: server
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64

Tools summary:
* Boot JDK: java version "1.7.0_201" OpenJDK Runtime Environment (IcedTea 2.6.17) (7u211-2.6.17-0ubuntu0.1) OpenJDK 64-Bit Server VM (build 24.201-b00, mixed mode) (at /usr/lib/jvm/java-7-openjdk-amd64)
* C Compiler: gcc-4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.4) version 4.8.4 (at /usr/bin/gcc-4.8)
* C++ Compiler: g++-4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.4) version 4.8.4 (at /usr/bin/g++-4.8)

Build performance summary:
* Cores to use: 4
* Memory limit: 22188 MB
* ccache status: installed and in use

WARNING: The result of this configuration has overridden an older
configuration. You *should* run 'make clean' to make sure you get a
proper build. Failure to do so might result in strange build problems.
......

然后,就可以执行编译命令进行编译, 执行:

1
make images

经过一段时间的编译后,如果没有出错,系统会显示如下的信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.......
## Finished images (build time 00:00:22)

----- Build times -------
Start 2021-04-09 09:48:59
End 2021-04-09 09:53:52
00:00:28 corba
00:00:23 demos
00:00:55 hotspot
00:00:22 images
00:00:14 jaxp
00:00:18 jaxws
00:01:32 jdk
00:00:27 langtools
00:00:14 nashorn
00:04:53 TOTAL
-------------------------
Finished building OpenJDK for target 'images'

查看编译结果

进入 openjdk 目录下的 build/linux-x86_64-normal-server-slowdebug/images/j2sdk-image 目录,就可以看到编译生产的JDK。

1
2
3
4
5
6
7
8
9
10
11
12
13
-r--r--r--  1 root root     2114 Apr  9 09:53 ADDITIONAL_LICENSE_INFO
-r--r--r-- 1 root root 1503 Apr 9 09:53 ASSEMBLY_EXCEPTION
-r--r--r-- 1 root root 19263 Apr 9 09:53 LICENSE
-r--r--r-- 1 root root 178392 Apr 9 09:53 THIRD_PARTY_README
drwxr-xr-x 2 root root 4096 Apr 9 09:53 bin
drwxr-xr-x 10 root root 4096 Apr 9 09:53 demo
drwxr-xr-x 3 root root 4096 Apr 9 09:53 include
drwxr-xr-x 4 root root 4096 Apr 9 09:53 jre
drwxr-xr-x 3 root root 4096 Apr 9 09:53 lib
drwxr-xr-x 4 root root 4096 Apr 9 09:53 man
-rw-r--r-- 1 root root 80 Apr 9 09:53 release
drwxr-xr-x 10 root root 4096 Apr 9 09:53 sample
-rw-r--r-- 1 root root 23881842 Apr 9 09:53 src.zip

进入 bin 目录,可以看到生成的可执行文件和工具,执行:

1
./java -version

系统显示:

1
2
3
openjdk version "1.8.0-internal-debug"
OpenJDK Runtime Environment (build 1.8.0-internal-debug-_2021_04_09_09_48-b00)
OpenJDK 64-Bit Server VM (build 25.40-b25-debug, mixed mode)

说明我们编译的JDK已经可以运行了。

TAGS