使用Javax读取图像会占用大量内存

时间:2011-05-13 19:31:42

标签: java swing javax.imageio

我正在使用JFileChooser打开大量文件,并且使用BufferedImage为每个图像创建image = ImageIO.read(path);。将图像声明为静态字段。

现在我已经拥有了30files 1Mb,并且在运行了60次read()后,我的内存使用量(在OS程序管理器中检查)增长了大约70Mb。

因为我的图像变量是静态的,所以不是图像内容存储在某个地方的问题。所以我的问题是,为什么我失去了这么多记忆?

我正在编写需要将大量图片加载到内存中的应用程序,是否有某个韭菜?清理未使用的数据是垃圾收集器任务吗?

以下是我读取此数据的代码:

public class FileListElement {

private static final long serialVersionUID = -274112974687308718L;

private static final int IMAGE_WIDTH = 1280;

// private BufferedImage thumb;
private static BufferedImage image;
private String name;

public FileListElement(File f) throws IllegalImageException {
    // BufferedImage image = null;
    try {
        image = ImageIO.read(f);
        // if (image.getWidth() != 1280 || image.getHeight() != 720) {
        // throw new IllegalImageException();
        // }
    } catch (IOException e) {
        e.printStackTrace();
    }
    image.flush();
    //
    // thumb = scale(image, 128, 72);
    // image = null;

    name = "aa";
}
}

它出了什么问题?

也许我做错了?我需要从大量图像或加载到RAM的压缩图像的原始像素。这样我就可以快速访问图像的任何像素。

加载1Mb pic需要的时间远远超过1Mb。

1 个答案:

答案 0 :(得分:3)

您不能指望当前的内存使用量是垃圾收集不能持续运行所需的内存量,尤其是如果您远离最大内存使用量。尝试加载更多图片,您可能会发现没有问题。

  

加载1Mb pic需要的时间远远超过1Mb。

好吧,我希望存储在磁盘上的格式可能压缩/小于内存中的BufferedImage。所以我认为这不奇怪。