使用HSDB验证Class对象和类的静态对象保存在堆中

本文通过HSDB(Hotspot Debugger)详细介绍了如何验证Class对象和类的静态变量存储在Java堆中。使用CLHSDB工具进行进程附加,并观察堆内存使用情况,发现类实例分配在TLAB中。进一步分析确认了Class对象的大小和结构,证明它们存在于堆中而非方法区。同时,展示了如何查找并查看Class对象的详细信息,包括Java镜像类及其持有的静态变量。
摘要由CSDN通过智能技术生成

HSDB(Hotspot Debugger)

运行

图形界面    java -cp $JAVA_HOME/lib/sa-jdi.jar sun.jvm.hotspot.HSDB
命令行      java -cp $JAVA_HOME/lib/sa-jdi.jar sun.jvm.hotspot.CLHSDB

本文使用的时命令行CLHSDB。
由于HSDB会先attach进程,然后暂停进程,所以线上慎用。。。

验证过程

使用到的类

public class Main {
    private static String name = "yuck";
    private static int age = 24;

    public static void main(String[] args) throws IOException {
        new Main();
        System.in.read();
    }
}

VM参数

-XX:+UseSerialGC  // 默认的XX:+UseParallelGC, 我在scanoops 会报no such type的异常,不知道是不是bug...
-XX:-UseCompressedOops

找到进程pid ,attach

> jps
19852 Main

> java -cp $JAVA_HOME/lib/sa-jdi.jar sun.jvm.hotspot.HSDB
> attach 19852

查看堆中内存使用情况

hsdb> universe
Heap Parameters:
Gen 0:   eden [0x0000000012400000,0x0000000012961068,0x0000000013eb0000) space capacity = 27983872, 20.155523867461945 used
  from [0x0000000013eb0000,0x0000000013eb0000,0x0000000014200000) space capacity = 3473408, 0.0 used
  to   [0x0000000014200000,0x0000000014200000,0x0000000014550000) space capacity = 3473408, 0.0 usedInvoc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值