BufferedImage.createGraphics()内存泄漏

时间:2012-11-23 12:03:37

标签: java memory memory-leaks bufferedimage graphics2d

下面的代码会导致内存泄漏。

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)。到目前为止,我一直只在阵列中使用一个灯进行测试。

避免内存泄漏的任何解决方案?

1 个答案:

答案 0 :(得分:0)

正如Andrew Thompson评论的那样,这不一定是内存泄漏。垃圾收集器的启动时间可能比您想象的要晚。您可以尝试使用System.gc()调用,当灯光不移动时,尽管通常不建议调用System.gc():When does System.gc() do anything

或者,您可以尝试直接操作BufferedImage后面的整数数组(不容易),或者使用其他API(如JOGL)。