下面的代码会产生内存泄漏。
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() 是问题所在。
这段代码可以经常执行(一个计时器被设置为以 50 毫秒的恒定速率滴答作响,如果灯正在“移动”,它会调用这段代码,但如果灯停留在同一个地方,则跳过此代码)。它运行良好,但每次都会使进程占用内存,这是一个级联进程,最终导致在不到一分钟的时间内从约 180 000 K 内存增加到超过 600 000 K 内存。从图形上看,它工作得很好,直到在某些时候笨拙变得太多(显然)并且 FPS 急剧下降。
现在我已经缩小了这个块产生泄漏的范围,因为评论它的调用会使问题消失。
绘制的基本图像为 1024x561,而灯光的图像相当小(50x50)。到目前为止,我一直在用阵列中的一盏灯对其进行测试。
任何避免内存泄漏的解决方案?