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 就存放在栈中。
执行其他方法时, 具体的操作: 栈帧执行对内存区域的影响。