2010-09-26 4 views
0

Я запрограммировал головоломку, в которой используется BufferedImage для каждой части. Это делается потому, что на нем есть тень и маркировка. Когда я совмещаю две части, я создал новый BufferedImage, нарисовал две части на нем и выбросил все ссылки на старые изображения. Моя проблема заключается в том, что при решении головоломки с множеством штук, например, около 100, программа, похоже, накапливает все больше и больше памяти, не запуская сборку мусора, и когда она, наконец, решает очистить, у нее заканчивается память, потому что остальные свободной памяти было слишком мало для запуска мусорной коллекции. Могу ли я сказать сборку мусора, чтобы собирать мусор чаще и во время игры, а не ждать до последнего момента?Обработка мусора в программе Java при производстве мусора

+1

Похоже, что у вас может быть утечка, а не что-либо еще - это не должно быть проблемой. –

ответ

0

Возможно, вы по-прежнему сохраняете косвенные ссылки на BufferedImage. Например:

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

Кроме того, могут быть родные ресурсы, выделенные с BufferedImage и/или его графики, которые могут (в зависимости от реализации JRE) задержать вывоз мусора из этих объектов. Вы можете намекнуть JRE на освобождение этих ресурсов, вызвав Graphics.dispose() и BufferedImage.flush().

1

Только объекты, на которые не указаны нигде, имеют право на GC. Так как GC будет всегда запускается прямо перед тем, как JVM умирает с OutOfMemoryError, это означает, что вы все еще ссылаетесь на объекты, зависящие от памяти, в текущей рабочей области кода. Решение прост: перестаньте ссылаться на них, когда они вам не нужны, или дайте JVM больше памяти для случая, когда вам нужны действительно.