Compiler SDK
下載jdk17u
開啟終端機,在Downloads目錄下,執行以下句子。
git clone https://github.com/openjdk/jdk17u
安裝一些必要的指令
# 安装基础编译工具和依赖
brew install autoconf freetype ccache pkg-config
xcode-select --install # 确保Xcode命令行工具已安装
下載zulu
未避免遇到以下問題
configure: Could not find a valid Boot JDK.
configure: This might be fixed by explicitely setting --with-boot-jdk
configure: error: Cannot continue
/Users/cici/Downloads/jdk8u/common/autoconf/generated-configure.sh: line 82: 5: Bad file descriptor
下載zulu
# 下載在Downloads目錄下
curl -LO https://cdn.azul.com/zulu/bin/zulu16.30.15-ca-jdk16.0.1-macosx_x64.tar.gz
## 解壓
tar -xzf zulu16.30.15-ca-jdk16.0.1-macosx_x64.tar.gz
## 設置臨時JAVA_HOME,非永久
export JAVA_HOME=$(pwd)/zulu16.30.15-ca-jdk16.0.1-macosx_x64
## 檢查版本
$JAVA_HOME/bin/java -version
確保執行結果為以下內容
openjdk version "16.0.1" 2021-04-20
OpenJDK Runtime Environment Zulu16.30+15-CA (build 16.0.1+9)
OpenJDK 64-Bit Server VM Zulu16.30+15-CA (build 16.0.1+9, mixed mode, sharing)
configure
進到jdk17u目錄
bash configure \
--with-debug-level=fastdebug \
--with-boot-jdk=$JAVA_HOME
make
進到jdk17u目錄
make JOBS=2 images
確保出現以下句子
Finished building target 'images' in configuration 'macosx-x86_64-server-fastdebug'
使用PrintVtableStats
進到jdk17u目錄
./build/macosx-x86_64-server-fastdebug/jdk/bin/java -XX:+UnlockDiagnosticVMOptions -XX:+PrintVtableStats -version | grep -i vtable
結果如下
openjdk version "17.0.16-internal" 2025-07-15
OpenJDK Runtime Environment (fastdebug build 17.0.16-internal+0-adhoc.cici.jdk17u)
OpenJDK 64-Bit Server VM (fastdebug build 17.0.16-internal+0-adhoc.cici.jdk17u, mixed mode)
vtable statistics:
7664 bytes fixed overhead (refs + vtable object header)
87360 bytes for vtable entries (8120 for arrays)
./build/macosx-x86_64-server-fastdebug/jdk/bin/javac -d . vtable_test/PolyExample.java ./build/macosx-x86_64-server-fastdebug/jdk/bin/java -XX:+UnlockDiagnosticVMOptions vtable_test.PolyExample Bark! Press Enter to exit…
jps -l | grep PolyExample 99284 vtable_test.PolyExample
./build/macosx-x86_64-server-fastdebug/jdk/bin/jhsdb clhsdb –pid 1708
dumpheap:导出堆内存到文件(需后工具分析)。
print:打印对象字段值(更高级抽象)。
mem 两种查询方式:
单地址 + 长度:address/count
从 address 开始,显示 count 个字节。
地址范围:address,address
显示两个地址之间的内存。
你输入的 mem 0x00000008000c1228+B8 0x20 有两个问题:
不支持 +B8 偏移量语法:必须手动计算地址(如 0x00000008000c1228 + 0xB8 = 0x00000008000c12e0)。
第二个参数 0x20 格式错误:长度需要用 / 分隔,而不是空格。0x20不支援,要用32 hsdb> mem 0x00000008000c1228/32
class Dog
hsdb> universe # 确认堆内存状态(你已执行)
hsdb> classes # 列出所有已加载的类
hsdb> class Dog
Dog @0x00000008000c1228
hsdb> inspect 0x00000008000c1228 # inspect 查看对象结构,再用 mem 分析原始内存:
hsdb> dumpclass 0x00000008000c1228
Array<Method> InstanceKlass::_methods: Array<Method*> @ 0x000000011e40e958
inspect 0x000000011e40ea58