解决Java内存泄漏的一般策略?

时间:2009-09-24 18:51:29

标签: java memory memory-management memory-leaks

我有一个我在本地运行的独立程序,它意味着是一个24/7运行的服务器类型程序。最近我发现它有内存泄漏,现在我们唯一的解决方案是每4小时重启一次。找到内存泄漏的最佳方法是什么?我们应该使用哪种工具和方法?

7 个答案:

答案 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