1
问题
- java 基础类型占用多少内存
- 疯传的new Object() 多少内存
- native 方法实现逻辑是什么样
- …
java基础数据类型表示
java对象的构成
- 博客
- 官网
- 源码
slowdebug:
bash ./configure --with-debug-level=slowdebug --enable-dtrace --with-native-debug-symbols=external --with-jvm-variants=server --with-target-bits=64 --with-boot-jdk=/Users/eleme/develop/Java/jdk-18.jdk/Contents/Home
调试OpenJDK
排查问题时候如果想要自己调试OpenJDK,那首先要编译一个自己的OpenJDK,之前都是在ubuntu下操作,由于环境限制,不能安装虚拟机,所以在mac下先编译OpenJDK。
mac环境编译 OpenJDK18
对的,没有看错,是18,不是8,因为机器编译环境比较高,8版本OpenJDK里面的语法目前编译器有些不支持,需要自己修改源码,收益不高;也想看看新版本有哪些新变化,所以选择git上比较新的tag,下面就开始操作了:
环境
组件 | 版本 |
---|---|
OS | macOS Big Sur 11.4 |
Xcode | 12.5 |
Java | OpenJDK 18ea |
步骤
- 安装字体引擎
brew install freetype
- 下载源码
wget https://github.com/openjdk/jdk/archive/refs/tags/jdk-18+4.tar.gz
- 解压后进入源码目录进行配置
bash ./configure --enable-debug --enable-dtrace --with-native-debug-symbols=internal --with-jvm-variants=server --with-target-bits=64 --with-boot-jdk=$JAVA_HOME --disable-warnings-as-errors
$JAVA_HOME 指定的版本17 或 18
- 编译配置文件compile-commands.json
make CONF=macosx-x86_64-server-fastdebug compile-commands
macosx-x86_64-server-fastdebug 是编译时在 {源码目录}/build 文件夹名称(编译项目名称)
- 编译
make CONF=macosx-x86_64-server-fastdebug
- 验证
./build/macosx-x86_64-server-fastdebug/jdk/bin/java -version
参考
https://github.com/openjdk/jdk/blob/master/doc/building.md
Debug OpenJDK
有了自己的编译的JDK,我们就可以使用它执行我们Java程序了,想看下JVM层面这么运行Java程序,我们可以调试OpenJDK,下面主要介绍使用Clion这么Debug OpenJDK:
导入和配置
- 导入clion
打开 ./build/macosx-x86_64-server-fastdebug 目录下的 compile-commands.json,选择Open As Project
项目root目录更换成源码目录
- 配置Custom Build Application
配置Custom Build Targets
上图External Tools 命令
1)make
# Program:make
# Arguments:CONF=macosx-x86_64-server-fastdebug
# Working directory:源码目录
2)clean
# Program:make
# Arguments:macosx-x86_64-server-fastdebug clean
# Working directory:源码目录
配置调试的程序
Debug
写一个java程序
openjdk调试代码输出中看到java程序中的输出
如果调试过程中有中断错误,在home下添加下面的文件
~/.lldbinit
breakpoint set --file {源码路径}/src/java.base/share/native/launcher/main.c --line 205 -C "pro hand -p true -s false SIGSEGV SIGBUS" --auto-continue true
参考
https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/#step_open_project_in_clion
https://github.com/openjdk/jdk21u/blob/jdk-21%2B35/doc/building.md
节奏:
-
String intern
-
class 解析
-
synchroized
-
线程start过程
-
一个jni例子
-
jvm初始化
-
G1
-
ZGC