原文地址:http://www.javashuo.com/article/p-gtzuxzek-hq.htmlhtml
在最近的工做中,经过JProfiler解决了一个内存泄漏的问题,现将检测的步骤和一些分析记录下来,已备从此遇到类似问题时能够做为参考。tomcat
运行环境:
内存泄漏的现象:
使用JProfiler检查内存泄漏的步骤:
1. 初始化检验环境:
切换到“Live Memory-->All Objects”标签,能够看到当前tomcat中的对象状况,注意jprofiler其余版本可能位置不同.服务器
在执行操做前,须要先F4,运行“Run GC”,使jvm进行内存回收清理无效的对象.为了便于比较内存的增加状况,能够点击右键--->"Mark Current",jvm
来将当前内存使用状况做为参照;点击后会显示“Difference”列,该列会列出对象数量的变化和变化比率工具
2.打开内存记录:
点击“Start Recordings”按钮,开始记录。执行这步的主要目的是为下面“Heap Walker”设置一个监控区间;若是不记录的话“Heap Walker”将分析jvm虚拟机的全部内存,即耗时又不能准确的发现内存泄漏的缘由。spa
3. 执行操做,执行gc;
4. 关闭内存记录:
5. 找到增长迅速的对象类型,打开HeapWalker:
在视图中找到增加快速的对象类型,本例Concurrenthashmap的增加速度很快。在memory视图中找到Concurrenthashmap---点右键----选择“Show Selectiion In Heap Walker”,切换到HeapWarker 视图;切换前会弹出选项页面,注意必定要选择“Select recorded objects”,这样Heap Walker会在刚刚的那段记录中进行分析;不然,会分析tomcat的全部内存对象,这样既耗时又不许确;htm
6. 在HeapWalker中,找到泄漏的对象;


经过切换到References页签,能够看到这个类的具体对象实例。对象
为了在这些内存对象中,找到泄漏的对象(应该被回收),能够在该对象上点击右键,选择“Use Selected Instances”缩小对象范围;blog
单击OK按钮内存
7. 经过引用分析该对象:
incoming 表示显示这个对象被谁引用;
outcoming 表示显示这个对象引用的其余对象;


8. 经过建立分析该对象:
