下面的代码会导致内存泄漏。
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() resulting in memory leak, is there a fix? .createGraphics()就是问题所在。
此代码可以经常执行(定时器设置为以50ms的恒定速率打勾,如果灯光“移动”则调用此代码,但如果灯光停留在同一位置,则跳过此代码)。它运行良好,但每次都使进程笨拙内存,这是一个级联过程,最终导致从不到一分钟内从~180 000 K内存增加到超过600 000 K内存。从图形上看它可以正常工作,直到某些时候clunk变得太多(显然)并且FPS急剧下降。
现在我已经缩小了这个块会产生泄漏,因为它的调用会使问题消失。
绘制的基本图像为1024x561,灯光图像相当小(50x50)。到目前为止,我一直只在阵列中使用一个灯进行测试。
避免内存泄漏的任何解决方案?
答案 0 :(得分:0)
正如Andrew Thompson评论的那样,这不一定是内存泄漏。垃圾收集器的启动时间可能比您想象的要晚。您可以尝试使用System.gc()调用,当灯光不移动时,尽管通常不建议调用System.gc():When does System.gc() do anything
或者,您可以尝试直接操作BufferedImage后面的整数数组(不容易),或者使用其他API(如JOGL)。