使用ImageIO.read(文件)读取图像;导致java.lang.OutOfMemoryError:Java堆空间

时间:2011-11-22 05:05:38

标签: java out-of-memory javax.imageio

我正在使用ImageIO API来编写PNG文件。此代码在循环中调用并导致OutOfMemory错误。无论如何可以修复以下代码以避免OutOfMemory错误?或者是增加JVM堆大小的唯一选择?

File file = new File(resultMap.get("outputFile").toString());

//ImageIO to convert jpg to png
BufferedImage img = ImageIO.read(file);
file = new File(resultMap.get("outputFile").toString() + ".png");
ImageIO.write(img, "png", file);   

Java堆大小为1024M。

2 个答案:

答案 0 :(得分:4)

我有一个类似的问题,我必须读取36张图像,裁剪它们并将它们保存到一个新文件(一次一个)。我发现在每次迭代后我必须将图像设置为null,以允许Java进行垃圾收集。即:

BufferedImage img;
for (int i=0; i<36; i++) {
    img = ImageIo.ImageIO.read(anImageFile);
    /* Do what's needed with the image (cropping, resizing etc.) */
    ImageIO.write(img, "jpg", outputFile);
    img.flush();
    img = null;
}

我知道它现在是一个老帖子,但我希望它可以在将来帮助某人。

答案 1 :(得分:2)

为什么不在flush(上尝试拨打BufferedImage)。它释放了一些资源。