我有一个我在本地运行的独立程序,它意味着是一个24/7运行的服务器类型程序。最近我发现它有内存泄漏,现在我们唯一的解决方案是每4小时重启一次。找到内存泄漏的最佳方法是什么?我们应该使用哪种工具和方法?
答案 0 :(得分:12)
如果您使用Sun的Java并且至少使用Java 6更新10(即最新的),那么请尝试在运行程序的同一台机器上运行JDK中的jvisualvm,并附加到它并启用分析。
这很可能是最简单的入门方式。
答案 1 :(得分:7)
当涉及到狩猎记忆问题时,我使用 SAP Memory Analyzer Eclipse Memory Analyser (MAT),一个堆转储分析工具。
Memory Analyzer提供了一个用于分析Java堆转储的通用工具包。除了堆散步和保留大小的快速计算之外,Eclipse工具还报告泄漏嫌疑人和内存消耗反模式。主要应用领域是Out of Memory Errors和高内存消耗。
由SAP发起,该项目已经开源,现在称为Eclipse Memory Analyser。查看Getting Started页面,尤其是Finding Memory Leaks部分(我在下面粘贴它,因为我修复了一些链接):
首先运行leak report以自动检查内存泄漏。
此博客详情How to Find a Leaking Workbench Window。
Memory Analyzer在SAP成长。那时,Krum在博客上发表了关于Finding Memory Leaks with SAP Memory Analyzer的文章。内容仍然相关!
对于堆转储分析(和内存泄漏),这可能是您可以获得的最佳工具(甚至是金钱)。
PS:我不适合SAP / IBM / Eclipse,我只是一个非常开心的MAT用户,并且有积极的反馈。
答案 2 :(得分:3)
您需要memory profiler。我建议您尝试Netbeans profiler。
答案 3 :(得分:2)
您可能会查找JMX和Java附带的jconsole应用程序。您可以开箱即用地获得一些有趣的统计数据,并为您的课程添加一些简单的工具可以提供更多。
答案 4 :(得分:1)
一种方法是定期进行堆转储,然后趋向于类的实例计数,以尝试确定哪些对象一致地创建但未收集。
另一种方法是关闭部分应用,以尝试缩小问题所在。
查看jmap和jhat等工具。
答案 5 :(得分:1)
正如已经说过的,jvisualvm是一个很好的入门方式,但是一旦你知道什么是泄漏,你可能需要找到对我所推荐的jmap和jhat有问题的对象的引用,例如
jmap -dump:live,file=heap.dump.out,format=b <pid>
和
jhat heap.dump.out
其中&lt; pid&gt;很容易从jvisualvm找到。然后在浏览器中导航到localhost:7000并开始探索。
答案 6 :(得分:0)
您需要尝试捕获 Java堆转储,它是Java进程的内存打印。 这是优化内存消耗和查找内存泄漏的关键过程。
Java堆转储是诊断与内存相关的问题(包括java.lang.OutOfMemoryError,垃圾回收问题和内存泄漏)的基本对象,这些都是Java Web开发过程的一部分
为清楚起见,在进行快照的瞬间,堆转储包含Java类和堆中的对象等信息。
要执行此操作,您需要运行jmap -dump:file=myheap.bin <program pid>
。
要了解有关如何捕获Java热堆的更多信息,请查看:https://javatutorial.net/capture-java-heap-dump