2010-09-26 57 views
0

我已經編寫了一個拼圖遊戲,每個遊戲塊都使用了BufferedImage。這是因爲它具有特定的陰影並在其上標記。 當我合併兩個部分時,我創建了一個新的BufferedImage,在它上面繪製兩個部分,並將所有對舊圖像的引用都扔掉。 我的問題是,在解決許多碎片像100個左右的難題時,程序似乎堆積了越來越多的內存而沒有運行垃圾回收,並且當它最終決定清理時,由於剩餘內存可用內存太少,垃圾收集無法運行。 有沒有什麼辦法可以讓垃圾收集更頻繁地收集垃圾,並且在遊戲過程中而不是等到最後一刻?處理Java程序中的垃圾收集,同時產生大量垃圾

+1

這聽起來像你實際上可能有泄漏,而不是其他任何東西 - 它不應該是一個問題。 – 2010-09-26 18:12:49

回答

0

您仍然可以持有對BufferedImage的間接引用。例如:

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

而且,有可能是BufferedImage的和/或它的圖形,它可以(根據實施JRE)延遲這些對象的垃圾收集分配的本機資源。您可以通過調用Graphics.dispose()和BufferedImage.flush()來提示JRE釋放這些資源。

1

只有在任何地方未被引用的對象纔有資格使用GC。由於GC將總是在JVM與OutOfMemoryError一起死亡之前運行,這意味着您仍在引用當前正在運行的代碼作用域中的內存佔用對象。解決方案很簡單:在不需要它們時停止引用它們,或者在您需要它們的情況下爲JVM提供更多內存。