一.运行测试代码
1.复制运行代码
让我们先贴一段代码,通过这段代码我们可以观察在运行时数据区的具体情况。
/**
* @author ningchuanqi
* 从底层深入理解运行时数据区
* -Xms30m -Xmx30m -XX:+UseConcMarkSweepGC -XX:-UseCompressedOops
* -Xss1m
*/
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 是局部变量
T1.setName("Jack");
T1.setSexType(MAN_TYPE);
T1.setAge(26);
for (int i = 0; i < 15; i++) {//进行15次垃圾回收
System.gc();//垃圾回收
}
Teacher T2 = new Teacher();
T2.setName("Rose");
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;
}
}
注意:本测试需要代码在运行中测试,最后一段代码不能删
2.修改配置信息
在运行前我们还需要修改一些信息。
点击这里,并把代码上面的 -Xms30m -Xmx30m -XX:+UseConcMarkSweepGC -XX:-UseCompressedOops 复制后开始,下一步
点击Modify options后勾选Add VM options,并把之前复制的粘贴到Java 8下面一行里,就可以点击apply了
运行代码。并一直保持在运行状态,如图
二.使用HSDB工具
打开cmd,并运行jps命令,并把JVMObject前面的数字复制后进行下一步操作
将C:\Program Files\Java\jdk1.8.0_111\jre\bin\sawindbg.dll复制到 C:\Program Files\Java\jre1.8.0_111\bin
我这个是已经复制过的。
然后进入 C:\Program Files\Java\jdk1.8.0_111\lib,打开cmd,执行 java -cp .\sa-jdi.jar sun.jvm.hotspot.HSDB
然后HSDB工具出来了
点击Flie,再点击第一行,就会出现上面的小弹窗,把之前复制的JVMObject前面的数字输入后,
就会出现这样一个窗口
这个窗口显示的是代码运行的所有线程。点击我标注(下面有红线)的 按钮,进入栈详细信息。