测试代码:
public class TestHeapDumper {
//该属性也从Heap上new出来
public Integer testInt= new Integer(1);
//测试方法
public static void main(String args[]) throws InterruptedException{
System.out.println("yes");
//在Heap堆上,new一个对象出来
TestHeapDumper testHeapDumper = new TestHeapDumper();
//程序等待,不要退出
Thread.sleep(1000000L);
//这里再次使用到testHeapDumper,防止GC掉;
System.out.println(testHeapDumper.testInt);
}
}
、
p0为dump文件的路径,后缀名为.hprof
然后再Memory Analyser工具中打开
可以发现在TestHeapDumper实例中,有TestInt变量。
如果把testInt申明为:
//测试是否能够在Heap堆上分配
public int testInt= 1;
可以发现并没有在Heap上分配。
Memory Analyser工具用起来很不错,可以通过outgoing reference 和incoming refence 引用来找到相互引用,如一张网; shallow Heap,Retained Heap表示对象自己大小和包括引用迭代出来的大小。具体可以参见 Eclipse Memory Analyser帮助文档
参见:http://www.ibm.com/developerworks/cn/java/j-lo-langref/
有对StrongReference, SoftReference, WeakReference 以及 PhantomReference 的特性及用法
的讲解。