目录
一、HSDB
1、测试用例:
package jvmTest;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
interface interTest{
void show();
}
class Base{
public int a;
public Base(int a) {
this.a = a;
}
}
class A extends Base implements interTest {
public int b;
public A(int a,int b) {
super(a);
this.b=b;
}
@Override
public void show() {
System.out.println("a->"+a+",b="+b);
}
}
public class MainTest {
public static void main(String[] args) {
String s="shl";
String[] s2={"shl","abc","bcd"};
A a=new A(1,2);
a.show();
while (true){
try {
System.out.println(getProcessID());
Thread.sleep(600*1000);
} catch (Exception e) {
}
}
}
public static final int getProcessID() {
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
System.out.println(runtimeMXBean.getName());
return Integer.valueOf(runtimeMXBean.getName().split("@")[0])
.intValue();
}
}
执行main方法后就可从控制台获取进程ID。
2、Java Threads窗口
进入JAVA_HOME的lib目录下,在命令行执行java -cp ./sa-jdi.jar sun.jvm.hotspot.HSDB就可唤起HSDB的图形界面,点击File-》Attach to Hotspot Process,输入进程ID,点击OK,
第一次使用时会报错,如下图:
这时将jdk/jre/bin目录下的sawindbg.dll拷贝到该目录下即可,重启,attach成功后进入如下界面:
该界面显示了当前Java进程下的几个子线程,main线程就是执行main方法的用户线程,另外5个是JVM自身使用的线程,选中main线程,上述的5个按钮就都可以点击了,第一个按钮Inspect Thread是查看选中的线程对应的java.lang.Thread对象,如下图:
可以层层展开查看该对象的各属性,也可改变地址框中的对象地址,查看特定引用对象的属性
第二个按钮Stack Memery是查看当前线程的调用栈的内存,如下图所示:
一共有3列,第一列是虚拟内存地址,第二列是该内存地址上的数据,以字宽为单位,64位CPU下就是8字节,即以该地址为起始往后8字节的数据,第三列是对内存数据的注释,同颜色的竖线表示范围,横线或斜线连接范围与注释文字,Interpreted frame表示一个调用栈帧,第一个对应sleep方法的调用栈帧,第二个对应main方法的调用栈帧,最下面的是main方法创建的局部变量的地址,比较奇怪的是代码中只创建了一个String[],这里却有两个ObjAarray了?还有一个是main方法的参数String[] args。
第三个按钮show Java stack trace是显示当前线程的调用链,点击其中的方法可查看方法的字节码,如main方法,注意本