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