我正在使用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。
答案 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
)。它释放了一些资源。