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

Handling garbage collection in Java program while producing a lot of garbage

我编写了一个拼图游戏,每个拼图都使用BufferedImage。 这样做是因为它具有特定的阴影和标记。
当我合并两个片段时,我创建了一个新的BufferedImage,在其上绘制了两个片段,并将所有对旧图像的引用扔掉了。
我的问题是,在解决许多类似100左右的拼图的过程中,该程序似乎在不运行垃圾回收的情况下堆积了越来越多的内存,并且当它最终决定清理时,由于剩余的空闲内存而耗尽了内存 内存太小,无法运行垃圾回收。
有什么办法可以让垃圾收集器在游戏过程中更频繁地收集垃圾,而不是等到最后一刻?


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


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

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

同样,可能有分配给BufferedImage和/或其Graphics的本地资源,这些资源可以(取决于JRE实现)延迟这些对象的垃圾回收。 您可以通过调用Graphics.dispose()和BufferedImage.flush()来暗示JRE释放这些资源。