为了方便所有人都可以编译调试 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