为了方便所有人都可以编译调试 OpenJdk,按照 OpenJdk 8 的推荐的配置,在虚拟机中配置好了环境。现在将该虚拟机分享出来方便有兴趣的人使用。
下载地址
链接:https://pan.baidu.com/s/1Lo7JiZfD9ikwSlhXZEsM8A
密码:yflp
大小:1.67G
解压要求磁盘有 20G 可用空间。
点击【查看原文】后跳转到可以点击的连接。
虚拟机要求
虚拟机版本: VMware 10.0.1 build-1379776。
低版本需要自己改版本号,高版本能直接用。
编译 OpenJdk 的时候配置越高耗时越少,所以第一次编译的时候尽可能配置更高的内存和CPU。默认配置的单处理器2核心和4G内存,电脑配置不高的可以减半。
使用方法
下载后解压,然后用 VMware 打开,运行时选择【我已移动】。
系统的用户名和密码分别为 openjdk
和 123
。登陆时输入密码 123
即可。
进入系统后,界面如下:
点击左侧【菜单】中第 6 个按钮(倒数第二个)NetBeans IDE。
启动 IDE 后,展开 OpenJDK,找到 jdk8 下面的 configure,右键 Run 执行。这个操作会很快,输出的部分日志(完整日志下载)如下:
Running generated-configure.sh
configure: Configuration created at Wed May 9 22:02:11 CST 2018.
configure: configure script generated at timestamp 1389186094.
checking for basename... /usr/bin/basename
checking for bash... /bin/bash
checking for cat... /bin/cat
...
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
...
====================================================
A new configuration has been successfully created in
/home/openjdk/OpenJdk/jdk8/build/linux-x86_64-normal-server-release
using default settings.
Configuration summary:
* Debug level: release
* 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_121"
(7u121-2.6.8-1ubuntu0.12.04.3) OpenJDK 64-Bit Server VM (build 24.121-b00, mixed mode)
(at /usr/lib/jvm/java-7-openjdk-amd64)
* C Compiler: gcc-4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5) version 4.6.3 (at /usr/bin/gcc-4.6)
* C++ Compiler: g++-4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5) version 4.6.3 (at /usr/bin/g++-4.6)
Build performance summary:
* Cores to use: 2
* Memory limit: 3945 MB
* ccache status: not installed (consider installing)
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.
RUN SUCCESSFUL (total time: 7s)
然后在 OpenJDK 项目上右键【Build】,这个过程在我电脑上使用了 27 分钟,这个期间可以干点别的。输出的部分日志(完整日志下载)如下:
Cleaning langtools build artifacts ... done
...
Cleaned all build artifacts.
CLEAN SUCCESSFUL (total time: 158ms)
## Starting langtools
...
## Finished langtools (build time 00:00:59)
## Starting hotspot
make[2]: warning: -jN forced in submake: disabling jobserver mode.
INFO: ENABLE_FULL_DEBUG_SYMBOLS=1
INFO: ALT_OBJCOPY=/usr/bin/objcopy
...
Compiling /home/openjdk/OpenJdk/jdk8/hotspot/src/share/vm/adlc/adlparse.cpp
Compiling /home/openjdk/OpenJdk/jdk8/hotspot/src/share/vm/adlc/archDesc.cpp
Compiling /home/openjdk/OpenJdk/jdk8/hotspot/src/share/vm/adlc/arena.cpp
Compiling /home/openjdk/OpenJdk/jdk8/hotspot/src/share/vm/adlc/dfa.cpp
Compiling /home/openjdk/OpenJdk/jdk8/hotspot/src/share/vm/adlc/dict2.cpp
----- Build times -------
Start 2018-05-09 22:12:27
End 2018-05-09 22:39:06
00:01:10 corba
00:00:33 demos
00:12:55 hotspot
00:01:17 images
00:00:36 jaxp
00:01:16 jaxws
00:07:32 jdk
00:00:59 langtools
00:00:19 nashorn
00:26:39 TOTAL
-------------------------
Finished building OpenJDK for target 'images'
BUILD SUCCESSFUL (total time: 26m 40s)
编译完成后,先找到 java.c 文件:
搜索文件:
打开该文件,然后找到 JavaMain 方法,添加断点:
在 NetBeans 的工程中,还有一个 JavaProject1 项目,里面有一个简单的 Java 代码,如下图所示:
下面我们调试 javac -cp xxx/classes test.Main
方法,在项目中,更具体的配置如下:
"${OUTPUT_PATH}" -cp /home/openjdk/NetBeansProjects/JavaApplication1/build/classes test.Main 1 2 3 hello 5
配置方式如下:
在调试时还可能会有一个找不到 java 的错误,这个错误和下面的配置有关:
路径:../../build/linux-x86_64-normal-server-release/jdk/bin/java
选择 java.c 文件,点击如图 Debug:
进入断点后如下图所示:
在 Debug 时,无法断点进入 Java 代码内。当 Java 代码调用 native 方法时,这些方法都可以断点,也就是从 java.c 调试能看到所有 c 和 cpp 代码的执行过程,看不到 Java 的。
注意:linux 系统相关的 native 代码一般都在 jdk8/jdk/src/solaris
目录中。
例如上述调试过程中,Java 代码中有 System.out.println
调用,我们可以在 solaris/native/java/io/FileOutputStream_md.c
中的 Java_java_io_FileOutputStream_writeBytes
方法断点,当执行到 println
时就会进入这里的断点,如下所示:
好了
到这里最基本的用法都说完了,如果想要测试 GC 等功能,可以通过合适的 Java 代码和 JVM 参数来启动 Debug,如果大家发现更好玩的用法欢迎留言交流。
最后奉劝一句,如果没有足够多的空闲时间,还是不要深入去看 OpenJdk 中的 c 和 cpp 代码,如果有这个时间不如先看看 JVM 规范和 Java 规范,看看 OpenJdk 中 Java 代码的实现部分。
Java 文档:https://docs.oracle.com/javase/10/
Java 规范:https://docs.oracle.com/javase/specs/index.html>
不管你是否听劝,我是不打算深入到这种程度来研究了。写作本文的主要目的就是想为你在 OpenJdk 方面的研究节省更多的时间。
如果你对 JVM 底层很感兴趣,还可以看看万能的 GraalVM