JDK6内存泄露定位方法–jmap

JDK6内存泄露定位方法–jmap

ID:39360924

大小:198.00 KB

页数:3页

时间:2019-07-01

JDK6内存泄露定位方法–jmap_第1页
JDK6内存泄露定位方法–jmap_第2页
JDK6内存泄露定位方法–jmap_第3页
资源描述:

《JDK6内存泄露定位方法–jmap》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

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

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

3、newHashMap();publicvoidtest(){inti=0;while(true){System.out.println(fo);//循环往leafMap放入值,每个value的大小为1m。leafMap.put(String.valueOf(i++),newbyte[1024*1024]);try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}}}publicstaticvoidmain(String[]args){newLeafMap().test

4、();while(true){}}}WindowJVM默认最大堆大小为64m,所以上面程序循环60次就出现内存溢出:3为了获取内存快照数据,不会让程序运行到内存溢出,大概循环到50以上就可以。首先通过JDK自带的jps命令。获取正在执行java进程号,如下图,LeafMap的运行进程号为:1716。接着我们就可以通过jmap获取内存某刻的快照:jmap-dump:format=b,file=f:/mdt/dmp/1716.bin1716打开mat,【File】->【OpenHeapDump】导入dump文件,自动分析dump数据显示如下图:切换到Histog

5、ram视图页面,点击点击标题头排序后发现byte数组占用内存f非常大,50多兆。在byte[]行上,点击右键。在右键菜单选择【Showobjectsofclass】->【byincomingreferences】,弹出一个新窗口,显示byte数组引用关系,展开如果下图:3从图中可以看到有多个地方存在byte数组,但只有HashMap对象占用比较大,有55个classjava.util.HashMap$Entry对象,每个对象大小超过1m,而HashMap在LeafMap中被使用。因此我们可以定位到LeafMap存在内存泄露的风险。在实际使用当中,可以获取多个

6、时刻的内存快照,进行前后比较,如果某一对象前后一直在增长,说明该处存在内存泄露的可能。3

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。