jprofiler 查看程序内存泄露
在最近的工作中,通过JProfiler解决了一个内存泄漏的问题,现将检测的步骤和一些分析记录下来,已备今后遇到相似问题时可以作为参考。
运行环境:
内存泄漏的现象:
使用JProfiler检查内存泄漏的步骤:
1. 初始化检验环境:
切换到“Live Memory-->All Objects”标签,可以看到当前tomcat中的对象情况。
在执行操作前,需要先运行“Run GC”,使jvm进行内存回收,清理无效的对象;
为了便于比较内存的增长情况,可以点击"Mark Current"按钮,来将当前内存使用情况作为参照;
点击后会显示“Difference”列,该列会列出对象数量的变化和变化比率;
2.打开内存记录:
点击“Start Recordings”按钮,开始记录。执行这步的主要目的是为下面“Heap Walker”,设置一个监控区间;如果不记录的话,“Heap Walker”将分析jvm虚拟机的所有内存,即耗时又不能准确的发现内存泄漏的原因。
3. 执行操作,执行gc;
可以点击下面的“update”按钮,进行视图的更新;
执行内存回收后,仍然存在于内存中的对象有可能是泄漏的对象;如下图,instance count中红色的部门为不能回收的对象,difference列列出了增加的对象数量和增幅;以String为例,在该操作中增加了31751个对象,增幅达到了14%,随后会在HeapWalker中观察这些对象,分析哪些对象是泄漏的;
一般引起泄漏的对象包括:String,char[],HashMap等,这些对象需要重点关注下;
4. 关闭内存记录:
5. 找到增加迅速的对象类型,打开HeapWalker:
在视图中找到增长快速的对象类型,一般包括String、char[]、Map等;
切换前会弹出选项页面,注意一定要选择“Select recorded objects”;这样Heap Walker会在刚刚的那段记录中进行分析;否则,如果不勾选的话,他会分析tomcat的所有内存对象,这样既耗时又不准确;
6. 在HeapWalker中,找到泄漏的对象;
通过切换到References页签,可以看到具体的对象;
在这些内存对象中,找到泄漏的对象(应该被回收);可以在该对象上点击右键,选择“Use Selected Instances”缩小对象范围;
7. 通过引用分析该对象:
incoming 表示显示这个对象被谁引用;
outcoming 表示显示这个对象引用的其他对象;
选择“Show In Graph”将引用关系使用图形方式展现;
选中该对象,点击“Show Paths To GC Root”,会找到引用的根节点;
在上图中,我们可以发现,这个String对象最终的引用是在Thread线程中的ThreadLocalMap对象中;这给我们提供了线索,我们需要在程序中查找有关ThreadLocalMap部分的代码,检查为什么这个对象没有被释放;这往往就是泄漏的根源。
8. 通过创建分析该对象:
内存泄漏的原因分析:
参考资料:
1. 转载自: https://blog.csdn.net/coslay/article/details/43270311
2.《利用Java剖析工具JProfiler查找内存泄漏的方法》http://jingyan.baidu.com/article/9c69d48f552d5f13c9024e3b.html
总结
以上是生活随笔为你收集整理的jprofiler 查看程序内存泄露的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Java之路(二) 操作符
- 下一篇: iOS正则表达式解决实际问题