基于Java的应用程序中的内存泄漏

时间:2010-10-28 15:51:26

标签: java performance memory-management memory-leaks

当一个短期对象持有长寿命对象时,应用程序中发生内存泄漏, 我的问题是我们如何识别 1)哪个物体寿命越来越长,任何测量物体寿命的工具?

第二个问题

我经常遇到内存不足错误,我尝试将堆内存增加到2 GB,但我还是得到了,请建议我使用任何开源工具来识别内存泄漏问题并修复。< / p>

目前我每次都重新启动服务器作为临时解决方案,但建议我可以永久修复的任何事情。

7 个答案:

答案 0 :(得分:5)

答案 1 :(得分:1)

有两个选项:

  • 它可能是您的应用程序没有足够的堆分配。测量输入的大小并为应用程序提供相应的堆;

  • 有内存泄漏:拿分析器,检查你的堆,找到不应该存在的对象或者那些太多的对象(用你的术语来说是“短生命对象”),找出哪些'长 - 生活'对象持有它们,解决这个问题。你应该知道你的代码,以了解哪些对象必须是“短生活”,哪些必须是“长寿”。

答案 2 :(得分:1)

我发现Netbeans中的Heap Walker非常有用

答案 3 :(得分:1)

如上所述,jvisualvm有很好的工具来分析堆。

但您也可以使用jvisualvm或-XX:+ HeapDumpOnOutOfMemoryError在文件中进行堆转储。然后将文件带到您的destkop,在Eclipse Memory Analyzer中打开它。 Eclipse MAT甚至可以更好地分析内存。

答案 4 :(得分:0)

内存不足发生在服务器上,因为它实际上耗尽了它允许的所有内存。不确定您用于托管服务器的应用程序,但对于Apache,您需要添加-Xmx512m行,其中512是允许的最大兆字节数。

如果你让应用程序运行得足够长,它就会发生。这不是因为Java中的内存泄漏,而是服务器本身倾向于这样做。您无法更改此行为,但至少可以增加256 MB的默认内存。对于我每天工作的重载工地,不幸的是,256 mb持续约30分钟。我发现1024 MB是合理的,很少因内存不足而崩溃。

除非程序员专注于覆盖典型的功能,否则我认为Java无法正常收集垃圾是非常不寻常的。

答案 5 :(得分:0)

我认为您可以使用jconsole跟踪内存泄漏(如果我没有弄错的话,它会随JDK 6一起提供)。

答案 6 :(得分:0)

持有对长寿命对象的引用的短期对象不会导致问题。 (一个好的overview,包括分代垃圾收集)。

2GB是一个非常多的对象/引用。如果你的2Gb堆空间不足,那么当你完成它们时,你可能会持有大量数据和/或保持开放资源。您应该至少发布一个关于您的应用程序的功能以及死亡所需时间的描述。

通过观察垃圾收集器(例如,使用“-verbose:gc”运行,可以告诉您垃圾收集器何时运行以及收集的数量),您可以快速了解正在发生的事情。