[英]BufferedImage.createGraphics() memory leak
下面的代碼產生內存泄漏。
public static BufferedImage mergeImages2(BufferedImage base, Collection<Light> images) {
BufferedImage output = new BufferedImage(base.getWidth(), base.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g = output.createGraphics();
g.drawImage(base, 0, 0, null);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, 1.0f));
for (Light l : images) {
g.drawImage(l.LIGHT_IMAGE, l.x, l.y, null);
l.LIGHT_IMAGE.flush();
}
g.dispose();
output.flush();
return output;
}
正如我在這里閱讀的: BufferedImage.getGraphics()導致內存泄漏,是否有修復程序? .createGraphics()是問題所在。
該代碼可以經常執行(將計時器設置為以50ms的恆定速率計時,如果燈光“移動”,它將調用此代碼,但是如果燈光停留在同一位置,則將其跳過)。 它運行良好,但每次都會使進程變得笨拙,這是一個級聯進程,最終導致在不到一分鍾的時間內從約18萬個內存增加到超過60萬個內存。 從圖形上講,它可以正常工作,直到在某些時候結塊變得過多(顯然)並且FPS急劇下降為止。
現在,我縮小了范圍,認為此塊會產生泄漏,因為注釋它的調用使問題消失了。
繪制的基本圖像為1024x561,燈光的圖像很小(50x50)。 到目前為止,我一直只用陣列中的一盞燈對其進行測試。
有什么解決方案可以避免內存泄漏?
正如安德魯·湯普森(Andrew Thompson)所說,這不一定是內存泄漏。 垃圾收集器的啟動可能比您想象的要晚。 您可以嘗試在燈光不動的情況下嘗試System.gc()調用,盡管通常不建議調用System.gc(): 什么時候System.gc()做任何事情
另外,您可以嘗試直接操作BufferedImage后面的整數數組(不容易),或者使用其他API(如JOGL)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.