当前访客身份:游客 [ 登录  | 注册加入尚学堂]
启用新域名sxt.cn
新闻资讯

Java Heap和Stack实验

helloworld 发表于 2年前  | 评论(0 )| 阅读次数(702 )|   0 人收藏此文章,   我要收藏
摘要 写Java程序不太注意变量到底是分配到Heap堆上,还是stack栈上,这几天在使用Heap Dump来分析堆内存(Heap),做了个实验。

测试代码:


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 的特性及用法

的讲解。

分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
声明:博客文章版权属于原创作者,受法律保护。如果侵犯了您的权利,请联系管理员,我们将及时删除!
(邮箱:webmaster#sxt.cn(#换为@))
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183