Чтение изображений с использованием ImageIO.read (файл); вызывает java.lang.OutOfMemoryError: пространство кучи Java - PullRequest
2 голосов
/ 22 ноября 2011

Я использую 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 ]

4 голосов
/ 05 февраля 2012

У меня была похожая проблема, когда мне приходилось читать 36 изображений, обрезать их и сохранять в новый файл (по одному за раз).Я понял, что после каждой итерации мне нужно было устанавливать нулевые изображения, чтобы позволить 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;
}

Я знаю, что теперь это старый пост, но я надеюсь, что он может помочь кому-то в будущем.

2 голосов
/ 22 ноября 2011

Почему бы вам не попробовать позвонить flush() на BufferedImage. Это освобождает некоторые из имеющихся ресурсов.

...