繁体   English   中英

如何在Java中读取许多图像而不会发生内存泄漏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM