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

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

你可能感兴趣的:(技术,java,jvm)