在Java程序中处理垃圾收集,同时产生大量垃圾

在Java程序中处理垃圾收集,同时产生大量垃圾,java,Java,我编写了一个拼图游戏,每一块都使用一个缓冲图像。这样做是因为它有一个特定的阴影和标记。 当我组合这两个部分时,我创建了一个新的BuffereImage,在上面绘制这两个部分,并将所有对旧图像的引用都扔掉。 我的问题是,在解决一个有100个左右碎片的谜题时,程序似乎在不运行垃圾收集的情况下积累了越来越多的内存,当它最终决定清理时,它会耗尽内存,因为剩余的可用内存太少,垃圾收集无法运行。 有没有办法让垃圾收集在游戏过程中更频繁地收集垃圾,而不是等到最后一刻?只有在任何地方都没有引用的对象才有资格使用

我编写了一个拼图游戏,每一块都使用一个缓冲图像。这样做是因为它有一个特定的阴影和标记。 当我组合这两个部分时,我创建了一个新的BuffereImage,在上面绘制这两个部分,并将所有对旧图像的引用都扔掉。 我的问题是,在解决一个有100个左右碎片的谜题时,程序似乎在不运行垃圾收集的情况下积累了越来越多的内存,当它最终决定清理时,它会耗尽内存,因为剩余的可用内存太少,垃圾收集无法运行。
有没有办法让垃圾收集在游戏过程中更频繁地收集垃圾,而不是等到最后一刻?

只有在任何地方都没有引用的对象才有资格使用GC。由于GC总是在JVM死机之前运行,并带有
OutOfMemoryError
,这意味着您仍然在引用当前运行的代码范围中占用内存的对象。解决方案很简单:当您不需要它们时停止引用它们,或者在您真正需要它们的情况下为JVM提供更多内存。

您仍然可以保留对BuffereImage的间接引用。例如:

Graphics g = bufferedImg.createGraphics();
bufferedImg = null;
// you still have an indirect reference through the graphics object g!

此外,可能存在使用BuffereImage和/或其图形分配的本机资源,这可能(取决于JRE实现)延迟这些对象的垃圾收集。您可以通过调用Graphics.dispose()和BufferedImage.flush()来提示JRE释放这些资源。

听起来您可能真的有漏洞,而不是其他任何东西,这应该不是问题。