深入理解Java虚拟机(1)——JDK源码分析
JVM,JDK,JAVA源码,JDK编译,JDK调试
JDK编译和运行
系统环境
- 系统:macOS Big Sur 11.6.1
- JDK IDE:CLion 2021.3.4
- Java IDE:IntelliJ IDEA 2021.3.3 (Ultimate Edition)
- Boot JDK:
java version “11.0.13” 2021-10-19 LTS
Java™ SE Runtime Environment 18.9 (build 11.0.13+10-LTS-370)
Java HotSpot™ 64-Bit Server VM 18.9 (build 11.0.13+10-LTS-370, mixed mode) - 编译 JDK:
openjdk version “12-internal” 2019-03-19
OpenJDK Runtime Environment (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f)
OpenJDK 64-Bit Server VM (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f, mixed mode)
编译JDK
依赖安装
hg版本管理工具(如果打包下载jdk,可以不用安装此依赖):
brew install mercurial
编译器缓存:
brew install ccache
字体库:
brew install freetype
自动配置:
brew install autoconf
如果brew安装慢,可以问一下搜索引擎配置成阿里云的镜像,这里不在赘述。
下载源码
源码地址:https://hg.openjdk.java.net/jdk/jdk12/file/06222165c35f
有两种方式可以获取到源码,基于国内的网络安全策略,建议使用第一种方式。
打包下载(推荐)
直接点击zip或者gz,下载压缩包,然后解压到自己的目录内。
clone下载
hg clone https://hg.openjdk.java.net/jdk/jdk12
编译
构建文档
编译之前建议读一遍源码里的构建文档,介绍了基础的安装步骤和一些注意事项,以及一些常见错误的解决方案,使用chrome翻译成中文后,对照着原文档很容易理解。路径是在${prefix_path}/jdk12-06222165c35f/doc/building.html
${prefix_path} 填写本地的绝对路径,例如:/Users/root/jdk-build/jdk12-06222165c35f,后文都以此表示,不在赘述。
运行配置
编译FastDebug版、仅含Server模式的HotSpot虚拟机:
切换到下载的jdk文件夹下
cd jdk12-06222165c35f
然后执行一下命令:
bash configure --enable-debug --with-jvm-variants=server
如果编译通过,应该会得到如下信息:
Configuration summary:
* Debug level: fastdebug
* HS debug level: fastdebug
* JVM variants: server
* JVM features: server: 'aot cds cmsgc compiler1 compiler2 dtrace epsilongc g1gc graal jfr jni-check jvmci jvmti management nmt parallelgc serialgc services shenandoahgc vm-structs'
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64
* Version string: 12-internal+0-adhoc.pengo.jdk12-06222165c35f (12-internal)
Tools summary:
* Boot JDK: java version "11.0.13" 2021-10-19 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.13+10-LTS-370) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.13+10-LTS-370, mixed mode) (at /Library/Java/JavaVirtualMachines/jdk-11.0.13.jdk/Contents/Home)
* Toolchain: clang (clang/LLVM from Xcode 13.2.1)
* C Compiler: Version 13.0.0 (at /usr/bin/clang)
* C++ Compiler: Version 13.0.0 (at /usr/bin/clang++)
Build performance summary:
* Cores to use: 8
* Memory limit: 16384 MB
构建
make images
在这个过程中你可能会遇到许多错误,可以参考此篇文章进行解决。传送门
编译完成后会输出如下信息:
Hello, My JDK
现在是测试一下你自己编译的JDK的时候了:
./build/macosx-x86_64-server-fastdebug/jdk/bin/java -version
正常会输出你编译的JDK版本号和配置的环境:
CLion调试
版本选择
书上选择的版本是CLion 2019.1,本人选择的版本是CLion 2021.3.4,2019版本可以问一下度娘,基本都有,现在只记录一下使用2021版本遇到的坑。
生成compile_commands.json
由于2021版本只有open选项,所以要在编译出来的JDK里生成compile_commands.json后再导入CLion中,https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/ Jetbrains中记录了这个问题,现在只说一下解决方法。
make CONF=macosx-x86_64-server-fastdebug compile-commands
macosx-x86_64-server-fastdebug是我本地的版本,可以替换成自己的,如果是第一次编译,建议设置成和楼主一样的,下文不再赘述。
之后在build/macosx-x86_64-server-fastdebug/compile_commands.json
就可以看到此文件。
编译
再执行一遍编译:
make CONF=macosx-x86_64-server-fastdebug
配置Toolchains
CLion中Preferences | Build, Execution, Deployment | Toolchains
中配置,我是取得默认的。
导入项目
File | Open
选中生成的compile_commands.json,然后通过Tools | Compilation Database | Change Project Root
把根目录设置为 jdk12-06222165c35f
。
配置Custom Build Targets
Preferences | Build, Execution, Deployment | Custom Build Targets
,先Add一个target,然后再增加一个External Tools。
make External Tools 配置信息:
Program: make
Arguments: CONF=macosx-x86_64-server-fastdebug
Working directory: ${prefix_path}/jdk12-06222165c35f
clean External Tools 配置信息:
Program: make
Arguments: CONF=macosx-x86_64-server-fastdebug clean
Working directory: ${prefix_path}/jdk12-06222165c35f
给一个命名:macosx-x86_64-server-fastdebug
,然后Build里填写make External Tools
,Clean里填写clean External Tools
配置Run/Debug Configurations
点击Edit Configurations,然后新建一个Custom Build Application,给一个命名,然后填写如下的配置:
Target: macosx-x86_64-server-fastdebug
Executable: ${prefix_path}/jdk12-06222165c35f/build/macosx-x86_64-server-fastdebug/jdk/bin/java
Program arguments: -version
然后删除掉Before launch
里的Build
。
可能有许多教程里写的是新建CMake Application,但楼主在2021版本中新建后,是无法选择上一步配置的Target的,可以根据自己选择的CLion版本,新建CMake Application和Custom Build Application都试一下,看一看哪个能用。
测试java -version
然后Run刚刚配置的Config,不出意外意外你应该能得到如下信息:
openjdk version "12-internal" 2019-03-19
OpenJDK Runtime Environment (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f)
OpenJDK 64-Bit Server VM (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f, mixed mode)
如果是Debug启动的话,你可能会出现断点,F9跳过即可,然后打印出下面的信息:
Signal: SIGSEGV (signal SIGSEGV)
Signal: SIGSEGV (signal SIGSEGV)
Signal: SIGSEGV (signal SIGSEGV)
openjdk version "12-internal" 2019-03-19
OpenJDK Runtime Environment (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f)
OpenJDK 64-Bit Server VM (fastdebug build 12-internal+0-adhoc.pengo.jdk12-06222165c35f, mixed mode)
有两种解决方案:
- 在LLDB下执行以下命令
pro hand -p true -s false SIGSEGV SIGBUS
- 或者在~/.lldbinit文件中,添加如下命令
breakpoint set --file /Users/naver/jvm/jdk12-06222165c35f/src/java.base/share/native/launcher/main.c --line 98 -C "pro hand -p true -s false SIGSEGV SIGBUS" --auto-continue true
不过楼主没有配置,各位可以根据情况自己配置。
测试普通java
在IDEA中新建一个项目,然后添加一个普通的类和main方法:
public class Main {
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
System.out.println("thread run");
});
System.out.println("Hello, My JDK.");
t1.start();
}
}
一定要在Source 目录下新建类,不然可能会报类找不到的异常:
错误: 找不到或无法加载主类 Main
原因: java.lang.NoClassDefFoundError: com/pengo/testdemo/testjdk/Main (wrong name: Main)
新建一个Custom Build Application
,给一个命名,然后填写如下的配置:
Target: macosx-x86_64-server-fastdebug
Executable: ${prefix_path}/jdk12-06222165c35f/build/macosx-x86_64-server-fastdebug/jdk/bin/java
Program arguments: Main
Working directory: /testdemo/src/main/java/
Working directory: 就是你IDEA项目的绝对路径。
Before launch
里配置一个External Tool,目的是把刚刚编写的Main.java编译成Main.class。
填写上如下的配置:
Program: ${prefix_path}/jdk12-06222165c35f/build/macosx-x86_64-server-fastdebug/jdk/bin/javac
Arguments: /testdemo/src/main/java/Main.java
Working directory: $ProjectFileDir$
如果一切正常,你会得到如下的信息:
Hello, My JDK.
thread run
参考文章
解决JDK编译过程问题
https://blog.csdn.net/qq_33543634/article/details/121153063
CLion配置
https://www.jianshu.com/p/0fc877be4c3d
https://blog.csdn.net/IamnotLoveJava/article/details/118543659
更多推荐
所有评论(0)