[英]How to read many images in java without memory leak
我需要读取许多图像才能对其进行处理。 最初,我使用IO库读取每个图像:
File outputfile = new File(uri);
BufferedImage imgBuff = ImageIO.read(outputfile);
imgBuff.flush();
imgBuff = null;
outputfile = null;
但是,它占用了大量内存,并且我的进程崩溃了。 经过研究,我发现使用java IO库读取许多图像存在很多问题。 我使用了这个简单的程序来验证内存泄漏是由于使用此图片http://tinyurl.com/ku3ff7w读取图片引起的:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.junit.Test;
public class MemoryLeakTest {
static File outputfile = null;
static BufferedImage imgBuff = null;
public static void main(String args[]) {
String uri = "/home/user/Pictures/image.jpg";
outputfile = new File(uri);
for (int i = 0; i < 15000; i++) {
outputfile = new File(uri);
try {
imgBuff = ImageIO.read(outputfile);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (imgBuff != null) {
imgBuff.flush();
imgBuff = null;
}
outputfile = null;
}
}
}
}
我也尝试过使用ImageJ库,但是在将图像转换为BufferedImage时发生了相同的问题:
ImagePlus bb = op.openImage(uri);
imgBuff = bb.getBufferedImage();
bb.killStack();
bb.flush();
bb.close();
我想我可以将图像读取为字节数组,这可以解决问题,但是解决方案并不理想。 有谁知道是否有任何库或方法可以读取Java中的许多图像而不会耗尽内存?
我的解决方案是使用img4Java(ImageMagick命令行的Java接口)。
通过这种方式,我将图像处理委托给了一个外部进程,从而释放了JVM来释放内存。
参见http://im4java.sourceforge.net/和http://www.imagemagick.org/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.