使用IBM heapAnalyzer分析内存泄露的原因

来源:互联网 发布:票据打印的软件 编辑:程序博客网 时间:2024/05/22 14:50

大家在开发J2EE应用时可能经常碰到OOM的问题。出现这种问题的原因就是内存消耗殆尽,创建新的对象时没有可分配的内存了。为了找到真正导致OOM的原因,这里将使用IBM heapAnalyzer工具进行定位。


首先要知道,IBM heapAnalyzer是通过分析OOM后的Java heap dump文件的,通过对dump文件的分析找到内存可能泄露的点。了解这个之后,我们首先需要生成dump文件,这里我可以编写一个小程序,如:

public class Test { /**  * @param args  */ public static void main(String[] args) {  List<String> list = new ArrayList<String>();  //10M的PermSize在integer范围内足够产生OOM了  int i = 0;  while (true) {   list.add(new String("test"));  } }}

运行该程序时设置JVM的堆内存的极限值为10M(-Xmx10m),并加上-XX:+HeapDumpOnOutOfMemoryError,此参数是帮助生成dump文件,程序启动后直到抛出OOM异常。异常抛出后,在程序的classpath下会生成以一个以.hprof结尾的文件,如:java_pid4504.hprof,这就是我们需要的dump文件。


dump文件有了,现在我们使用heapAnalyzer对该dump进行分析,首先需要安装heapAnalyzer,安装比较简单,只要下载下来直接解压即可,我这里使用的是ha414.jar,要求JDK1.6,设置JAVA_HOME后,通过命令后启动heapAnalyzer,如:java -jar ha414.jar。


HeapAnalyzer启动后的界面如下:

HeapAnalyzer启动后,通过菜单File->Open打开生成的dump文件java_pid4504.hprof。

dump文件加载后,通过菜单Analysis->Tree View展现出来。

通过dump信息分析内存泄漏的对象。主要思路是堆内存占用比例,比例越大说明堆内存消耗越多。

这个例子很简单,通过如下图很快就可定位出内存泄漏的地方。

这里可以看到java/util/ArrayList对象占用堆内容最大,达到93%。当然这里并不是说ArrayList存在问题,而是说ArrayList占用的堆内存较多,不正常,至于为啥会不正常,这还依赖于该对象所处的程序块相关,找到这点问题就解决一大半了。

最后需要在程序中找到使用该对象的地方,再分析程序,确定产生内存泄漏的原因。

原文地址:http://www.51testing.com/html/61/412661-241471.html

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信不小心删了聊天记录怎么办 当聊天没话题了怎么办 老婆和别人频繁聊天老公怎么办 qq上把人屏蔽了怎么办 注册微信验证码发不出去怎么办 两个人在一起没有话题怎么办 两个人聊天没话题怎么办 qq邮箱限制信用卡账单怎么办 和朋友聊天没话题怎么办 跟朋友聊天没话题怎么办 和朋友聊天找不到话题怎么办 qq加好友忽略了怎么办 微信加好友收不到验证消息怎么办 陌陌距离乱了怎么办 qq不能点赞了怎么办 快递发货地址写错了怎么办 订的海鲜不发货怎么办 拉人进群频繁了怎么办 qq群邀请过于频繁怎么办 qq一直被拉进群怎么办 qq号被冻结解封不了怎么办 2018qq自动进群怎么办 手机视频传到电脑倒着怎么办 qq群图片过期了怎么办 q号加不了群怎么办 q号加不了好友怎么办 q号被冻结了怎么办 qq群200人满了怎么办 畅聊之火消失了怎么办 手机版WPS打开文档空白怎么办 空白表格怎么打印不出来怎么办 微信朋友太少怎么办 js和CSS加载失败怎么办 熹妃q传密码忘了怎么办 苹果手机淘宝占用空间大怎么办 苹果相册储存空间不足怎么办 企业网银里的收款名单丢失怎么办 发邮件发错了怎么办 qq群成员满500了怎么办 为什么qq群查不到信息怎么办 tiger杯子油漆划掉了怎么办