使用IBM heapAnalyzer分析内存泄露的原因
来源:互联网 发布:淘宝2017今日成交量 编辑:程序博客网 时间:2024/05/22 18:13
大家在开发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,安装比较简单,只要下载下来直接解压即可,IBM HeadAnalyzer
我这里使用的是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占用的堆内存较多,不正常,至于为啥会不正常,这还依赖于该对象所处的程序块相关,找到这点问题就解决一大半了。
最后需要在程序中找到使用该对象的地方,再分析程序,确定产生内存泄漏的原因。
类似的工具还有:Eclipse MemoryAnalyzer
- 使用IBM heapAnalyzer分析内存泄露的原因
- 使用IBM heapAnalyzer分析内存泄露的原因
- 使用IBM heapAnalyzer分析内存泄露的原因
- IBM heapAnalyzer分析内存泄露
- IBM HeapAnalyzer简介使用
- 用 IBM HeapAnalyzer 和 MOD4J 分析 Java 内存泄漏
- IBM HeapAnalyzer和MOD4J分析Java内存泄漏
- 实例讲解:使用IBM heapAnalyzer分析heap dump文件步骤
- 实例讲解:使用IBM heapAnalyzer分析heap dump文件步骤 .
- 使用IBM heapAnalyzer分析heap dump文件步骤
- 内存泄露原因分析
- Android内存泄露分析之-内存泄露的原因
- Android中内存泄露的原因分析:
- JAVA内存泄露的原因分析
- 内存泄露的原因
- 内存泄露的原因
- 内存泄露的原因
- 内存泄露的原因
- 【web service调用】 抓取资源
- 北京林业大学“计蒜客”杯程序设计竞赛 网络赛 A. 喝酒
- SharedPreferenceUtils
- Tablayout 里面的tab 显示的时候靠近在一起的解决办法
- Lua简明教程
- 使用IBM heapAnalyzer分析内存泄露的原因
- 新手seoer怎样恰到好处的展开日常优化工作
- Android中设计模式的比较
- Java并发编程:深入剖析ThreadLocal
- MySQL 5.7新增sys.session表查看系统运行状态
- SQL基本语句总结
- CURL错误代码
- java基础之断言
- iOS 页面间几种传值方式(属性,代理,block,单例,通知)