Java System.GC()和内存泄漏

Java System.GC()和内存泄漏,java,memory-leaks,garbage-collection,Java,Memory Leaks,Garbage Collection,我在论坛上读到并搜索了关于内存泄漏和内存逐渐增加的内容。我试图在程序中每隔60秒使用System.GC方法调用一次,但考虑到我的RAM使用情况,每次调用都会减少,因此它似乎可以正常工作。为什么不使用这种方法是个好主意?在我读过的每一篇文章中,他们似乎都含糊不清地解释了为什么这种方法不能释放内存,而我的程序却似乎不这么说。有些人甚至说,这个方法除了建议垃圾收集器清理自己之外,什么也没做。注意:我的漏洞不是来自我知道的静态方法,因为我从整个项目中删除了它们,RAM仍然在增加。我会发布我的代码,但它相

我在论坛上读到并搜索了关于内存泄漏和内存逐渐增加的内容。我试图在程序中每隔60秒使用System.GC方法调用一次,但考虑到我的RAM使用情况,每次调用都会减少,因此它似乎可以正常工作。为什么不使用这种方法是个好主意?在我读过的每一篇文章中,他们似乎都含糊不清地解释了为什么这种方法不能释放内存,而我的程序却似乎不这么说。有些人甚至说,这个方法除了建议垃圾收集器清理自己之外,什么也没做。注意:我的漏洞不是来自我知道的静态方法,因为我从整个项目中删除了它们,RAM仍然在增加。我会发布我的代码,但它相当大,所以我怀疑有人能读到它

谢谢您的帮助。

正如您所说,System.gc只是一个建议。虽然在实践中经常强制垃圾收集,但不能保证强制垃圾收集

Java垃圾收集会自己定期运行。如果您看到您的内存随着时间的推移而增加,并且您没有回收它,那么您就有内存泄漏。调用System.gc无法解决此问题。如果您的内存正在泄漏,最终将无法收集任何内容


一般来说,您不需要强制GC。正如我提到的,GC将独立运行。您可以调整它的行为-。

最初的问题来自内存泄漏。 交响乐团 *由于内存泄漏,内存空间不足 *因此JVM将再次尝试执行GC。 *但仍然有足够的记忆。所以,再一次

因此System.GC或某种GC调优是没有帮助的

要解决这个问题,您必须找到内存泄漏点的位置

在JVM中,有一些工具转储当前内存足迹heapdump

你可以用这个找到泄漏点。
有关更多信息,请参阅此-

您并没有真正保存任何调用GC的内容。当堆填满时,GC将被触发,这并没有什么真正的好处,但会导致更快的发生,这会带来执行成本。请理解,每次您(比如)创建一个字符串以用于打印语句时,您都会以某种方式泄漏该字符串的存储空间,因为处理完后不会立即回收该字符串。但这没关系,因为GC会找到这些未使用的对象并为您回收存储。但这不需要立即发生-与等待GC正常触发相比,提前恢复存储没有任何好处。@Hot-Licks好的,我现在明白了。默认情况下,只打印出信息会增加内存使用量,而调用GC方法会清除用于此操作的RAM。那么我该如何着手解决这个明显的泄漏问题呢。我删除了所有的静态数据,但没有重大更改。我有大量的ActionListener使用计时器,这可能是问题吗?什么明显的泄漏问题?到目前为止,您还没有描述过。@Hot-Licks当我运行程序时,我以图形方式打印出来的内存使用量一直在逐渐增加,除非我使用GC方法。次要问题:如果您看到GC运行后立即占用的存储量随着时间的推移而增加,那么您就有某种泄漏。地面军事系统之间占用的存储空间增加是完全正常的。@Jeff Storey感谢您提供的信息。泄漏是否可能来自我无法控制的东西,或者我只是在做任何可能导致这种情况发生的事情?视情况而定-可能来自任何一种。当你的应用程序运行时,内存使用量增加是正常的,但是你是否看到内存不断增加到耗尽的程度?我真正想问的是-你确定你有漏洞吗?从我打印出的ram使用情况来看,我的程序会,尽管它可能需要很长时间,但每运行一秒钟,程序就会增加大约.5%。我不知道是我简单地打印了RAM的使用情况,还是其他原因。随着时间的推移,我发现这可能是一个问题,因为始终存在的OutOfMemoryException。@Jeff Storey当我调用GC方法时,它确实增加了,但只增加了.00001%。这是否意味着我真的没有合法的泄密?谢谢你的文章,我将把它收藏起来。这是非常有用的。