JHSDB 工具

本文介绍了JHSDB进程外调试工具的使用方法,包括在不同JDK版本下的启动方式。并通过示例代码展示了如何利用JHSDB查看JVM中的对象和栈信息,帮助读者深入理解JVM内存布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JHSDB 是一款基于服务性代理实现的进程外调试工具。 服务性代理是 HotSpot 虚拟机中一组用于映射 Java 虚拟机运行信息的, 主要基于 Java 语言实现的
API 集合。

JDK1.8 的开启方式
开启 HSDB 工具
Jdk1.8 启动 JHSDB 的时候必须将 sawindbg.dll( 一般会在 JDK 的目录下) 复制到对应目录的 jre 下(注意在 win 上安装了 JDK1.8 后往往同级目录下有一个
jre 的目录)


然后到目录: C:\Program Files\Java\jdk1.8.0_101\lib 进入命令行,

执行 java -cp .\sa-jdi.jar sun.jvm.hotspot.HSDB

JDK1.9 及以后的开启方式
进入 JDK 的 bin 目录下, 我们可以在命令行中使用 jhsdb hsdb 来启动它
 

JHSDB 中查看对象

启动代码进行测试

代码

/**
 * @author King老师
 * VM参数
 * -Xms30m -Xmx30m  -XX:MaxMetaspaceSize=30m  -XX:+UseConcMarkSweepGC -XX:-UseCompressedOops
 *
 *
 */
public class JVMObject {
    public final static String MAN_TYPE = "man"; // 常量
    public static String WOMAN_TYPE = "woman";  // 静态变量
    public static void  main(String[] args)throws Exception {
        Teacher T1 = new Teacher();
        T1.setName("Mark");
        T1.setSexType(MAN_TYPE);
        T1.setAge(36);
        for(int i =0 ;i<15 ;i++){
            System.gc();//主动触发GC 垃圾回收 15次--- T1存活
        }
        Teacher T2 = new Teacher();
        T2.setName("King");
        T2.setSexType(MAN_TYPE);
        T2.setAge(18);
        Thread.sleep(Integer.MAX_VALUE);//线程休眠
    }
}

class Teacher{
    String name;
    String sexType;
    int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getSexType() {
        return sexType;
    }
    public void setSexType(String sexType) {
        this.sexType = sexType;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

启动代码

因为 JVM 启动有一个进程, 需要借助一个命令 jps 查找到对应程序的进程

在 JHSDB 工具中 attach 上去

  

JHSDB 中查看对象
 

查看堆参数

  

上图中可以看到实际 JVM 启动过程中堆中参数的对照, 可以看到, 在不启动内存压缩的情况下。 堆空间里面的分代划分都是连续的。
再来查看对象:

这里可以看到 JVM 中所有的对象, 都是基于 class 的对象

全路径名搜索

双击出现这个 Teacher 类的对象, 两个, 就是 T1 和 T2 对象。

 

 

最后再对比一下堆中分代划分可以得出为什么 T1 在 Eden,T2 在老年代

JHSDB 中查看栈


 

从上图中可以验证栈内存, 同时也可以验证到虚拟机栈和本地方法栈在 Hotspot 中是合二为一的实现了。
 

 

当我们通过 Java 运行以上代码时, JVM 的整个处理过程如下:
1. JVM 向操作系统申请内存, JVM 第一步就是通过配置参数或者默认配置参数向操作系统申请内存空间。
2. JVM 获得内存空间后, 会根据配置参数分配堆、 栈以及方法区的内存大小。
3. 完成上一个步骤后, JVM 首先会执行构造器, 编译器会在.java 文件被编译成.class 文件时, 收集所有类的初始化代码, 包括静态变量赋值语句、
静态代码块、 静态方法, 静态变量和常量放入方法区
4. 执行方法。 启动 main 线程, 执行 main 方法, 开始执行第一行代码。 此时堆内存中会创建一个 Teacher 对象, 对象引用 student 就存放在栈中。
执行其他方法时, 具体的操作: 栈帧执行对内存区域的影响。
 

 

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值