2014-01-21 166 views
0

我已经阅读并通过论坛搜索有关泄漏内存和逐渐增加内存。我试图在我的程序中每60秒使用System.GC()方法的调用,并且由于我的RAM使用量每次调用都会下降,所以它似乎正在工作。为什么不使用这种方法是个好主意?在我读过的每篇文章中,他们似乎都模糊地解释了为什么这种方法不能释放内存,但我的程序似乎是另有说法。有人甚至说这种方法什么都没做,但建议垃圾收集者清理干净。注意:我的泄漏不是来自我知道的静态方法,因为我从整个项目中删除了它们,RAM仍然增加。我会发布我的代码,但它相当大,所以我怀疑任何人都会阅读它。Java System.GC()和内存泄漏

感谢您的帮助。

+0

你真的不保存任何调用GC的东西。当堆积满GC时将被触发,并且没有真正的优势(但是*执行成本)使其更快地发生。 –

+0

要明白,每当你创建一个要在打印语句中使用的字符串,你(以某种方式)“泄漏”该字符串的存储空间,因为当你完成它时,它不会立即“回收”。但没关系,因为GC会找到这些未使用的对象并为您回收存储空间。但是这并不需要立即发生 - 与等待GC“正常”触发相比,提早恢复存储没有任何优势。 –

+0

@热舔好了我现在明白了。仅在默认情况下打印出信息会增加内存使用量,并调用GC方法清理用于此目的的RAM。那么我怎么去解决这个明显的泄漏问题。我删除了所有的静态信息,但没有发生重大变化。我有大量使用计时器的actionListeners可能是问题所在? – StoneAgeCoder

回答

1

如您所述,System.gc()只是一个建议。它不保证强制垃圾收集,尽管在实践中经常这样做。

Java垃圾收集定期运行。如果你发现你的记忆随着时间的推移正在增加,而你没有收回它,那么你就有内存泄漏。调用System.gc()不会解决这个问题。如果你的记忆力正在泄漏,最终将没有任何东西可以收集。

一般情况下,你不需要强制GC。正如我所提到的,GC将自行运行。你可以调整它的行为 - http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

+0

小问题:如果您发现GC运行*后立即占用的存储量*会随着时间的推移而增加,则会出现(某种)“泄漏”。在GC之间增加占用的存储空间是非常正常的。 –

+0

@Jeff Storey谢谢你的信息。泄漏可能来自我无法控制的事情,或者我正在做特别可能导致这种事情发生的任何事情? – StoneAgeCoder

+0

取决于 - 它可能来自任何一个。当你的应用程序正在工作时,看到增加的内存使用情况是正常的,但你是否看到内存不断增加到你用完的地步?我真正要问的是 - 你确定你有泄漏吗? –

-1

原始问题来自内存泄漏。 Sympthom是 *由于内存泄漏,没有足够的内存空间 *因此JVM会再次尝试再次执行GC操作。 *但仍有足够的内存。所以再次GC。

因此System.GC或GC调整类型没有帮助。

要解决这个问题,你必须找到我们的内存泄漏点在哪里。

在JVM中,有一些工具可以转储当前内存足迹(heapdump)。

你可以通过这个找出泄漏点。 欲了解更多信息,请参阅 - http://www.oracle.com/technetwork/java/javase/memleaks-137499.html

+0

谢谢你的文章我将书签。这非常有用。 – StoneAgeCoder