我有我在本地运行一个独立的程序,这意味着是全天候运行的服务器类型的节目。 最近,我发现它有内存泄漏,现在我们唯一的解决办法是重新启动它每4个小时。 什么是去寻找这个内存泄漏的最佳方法是什么? 我们应该使用何种工具和方法?
Answer 1:
如果您使用的是Java Sun和至少使用了Java 6 Update 10的(即最新的),然后尝试从JDK在同一台机器上运行jvisualvm为你的程序正在运行,并重视它,并启用分析。
这是最容易上手的最简单方法。
Answer 2:
当谈到狩猎内存问题,我使用SAP的内存分析器 Eclipse的内存分析器(MAT) ,堆转储分析工具。
该内存分析器提供了一个通用的工具包来分析Java堆转储。 除了堆行走和保持尺寸的快速计算,在Eclipse工具报告泄漏疑犯和内存消耗反模式。 应用的主要领域是内存不足的错误和高存储器消耗。
由SAP发起的,该项目此后一直开源,现在知道作为Eclipse的内存分析器 。 退房的入门页面,尤其是查找内存泄漏部分(我下面粘贴的,因为我固定的一些链接):
通过运行开始泄漏报告为自动检查内存泄漏。
此博客详细介绍如何找到泄漏工作台窗口 。
该内存分析器在SAP长大。 当时,克鲁姆博客中查找内存泄漏与SAP的内存分析器 。 内容仍然是相关的!
这可能是堆转储分析(和内存泄漏)的最佳工具,就可以得到(甚至是金钱)。
PS:我没有为SAP工作/ IBM / Eclipse的,我只是用积极的反馈非常高兴MAT用户。
Answer 3:
你需要一个内存分析器 。 我建议尝试Netbeans的探查 。
Answer 4:
你可能会查找JMX和JConsole的应用程序,随Java。 你可以得到一些有趣的统计数据外的开箱,并添加一些简单的仪器到你的类可以提供很多更多。
Answer 5:
一种办法是采取定期堆转储,那么你的潮流类的实例计数,试图找出哪些是被一致创建对象,但没有收集。
另一个办法是关掉你的应用程序的部分要尽量缩小问题的所在。
看看像JMAP和工具与jHat。
Answer 6:
如前所述jvisualvm是开始的好方法,但一旦你知道什么是泄漏你可能需要找到是什么在阻止有问题的对象引用了,我建议你JMAP和与jHat,如
jmap -dump:live,file=heap.dump.out,format=b <pid>
和
jhat heap.dump.out
其中<PID>容易从jvisualvm找到。 然后在浏览器中浏览到本地主机:7000和开始探索。