jdk6内存泄露定位方法–jmap

上传人:小** 文档编号:89347050 上传时间:2019-05-23 格式:DOC 页数:3 大小:198KB
返回 下载 相关 举报
jdk6内存泄露定位方法–jmap_第1页
第1页 / 共3页
jdk6内存泄露定位方法–jmap_第2页
第2页 / 共3页
jdk6内存泄露定位方法–jmap_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《jdk6内存泄露定位方法–jmap》由会员分享,可在线阅读,更多相关《jdk6内存泄露定位方法–jmap(3页珍藏版)》请在金锄头文库上搜索。

1、JDK6内存泄露定位方法 jmap编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm来进行处理,当java对象不再被应用时,等到堆内存不够用时,jvm 会进行垃圾回收,清除这些对象占用的堆内存空间,如果对象一直被应用,jvm无法对其进行回收,创建新的对象时,无法从Heap中获取足够的内存分配给对 象,这时候就会导致内存溢出。而出现内存泄露的地方,一般是不断的往容器中存放对象,而容器没有相应的大小限制或清除机制。容易导致内存溢出。 当服务器应用占用了过多内存的时候,如何快速定位问题呢?现在,Eclipse MAT的出现使这个问题变得非常简单。Eclipse MAT是著

2、名的SAP公司贡献的一个工具,可以在Eclipse网站下载到它,完全免费的。 要定位问题,首先你需要获取服务器jvm某刻内存快照。jdk自带的jmap可以获取内存某一时刻的快照,导出为dmp文件后,就可以用Eclipse MAT来分析了,找出是那个对象使用内存过多,使用命令为:$JAVA_HOME/bin/jmap -dump:format=b,file=String 下面用一个实例来演示内存溢出,然后通过Eclipse MAT定位出导致内存溢出的对象。 public class LeafMap private Map leafMap = new HashMap(); public void

3、test() int i = 0; while(true) System.out.println(fo); /循环往leafMap放入值,每个value的大小为1m。 leafMap.put(String.valueOf(i+), new byte1024*1024); try Thread.sleep(1000); catch (InterruptedException e) e.printStackTrace(); public static void main(String args) new LeafMap().test(); while(true) Window JVM默认最大堆大小

4、为64m,所以上面程序循环60次就出现内存溢出: 为了获取内存快照数据,不会让程序运行到内存溢出,大概循环到50以上就可以。首先通过JDK自带的jps命令。获取正在执行java进程号,如下图,LeafMap的运行进程号为:1716。 接着我们就可以通过jmap获取内存某刻的快照: jmap -dump:format=b,file=f:/mdt/dmp/1716.bin 1716 打开mat,【File】-【Open Heap Dump】导入dump文件,自动分析dump数据显示如下图: 切换到Histogram视图页面,点击点击标题头排序后发现byte数组占用内存f非常大,50多兆。 在byte行上,点击右键。在右键菜单选择【Show objects of class】-【by incoming references】,弹出一个新窗口,显示byte数组引用关系,展开如果下图: 从图中可以看到有多个地方存在byte数组,但只有HashMap对象占用比较大,有55个class java.util.HashMap$Entry对象,每个对象大小超过1m,而HashMap在LeafMap中被使用。因此我们可以定位到 LeafMap存在内存泄露的风险。 在实际使用当中,可以获取多个时刻的内存快照,进行前后比较,如果某一对象前后一直在增长,说明该处存在内存泄露的可能。3

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号