2

我在使用 BufferedImage 时遇到了奇怪的问题,在某些情况下它会消耗所有可用的系统内存(3GB、1.5GB 可用)。

我创建了一个简单的包装器,并像这样使用它:

public ImageWrapper(final byte[] bytes) throws ImageWrapperException {
    this(new ByteArrayInputStream(bytes));
}



public ImageWrapper(final ByteArrayInputStream bis) throws ImageWrapperException {
    try {
        image = ImageIO.read(bis);
        bis.close();
    } catch (IOException e) {
        throw new ImageWrapperException(e);
    }
}

(我已经验证了它甚至会发生image = ImageIO.read(file);

在第一个“无法分配内存”之前,我没有任何异常。

由于某种原因,在读取特定类型的图像时,图像的读取最终会消耗掉所有的系统内存。我不是在谈论堆,而是真正的系统内存。

它只发生在某些环境中——它不会发生在我的OSX上,但它会发生在我的Debian服务器上。

  1. 你知道为什么会发生这种情况吗?
  2. 有没有 BufferedImage 的替代品,可能效果更好?
  3. 有问题的机器是虚拟服务器。会不会是它的配置造成的?

谢谢

编辑:

  1. 示例图片:http ://cl.ly/1P430l0V1g133r0C291J
  2. 它只是第一个也是唯一一个会产生这个的实例。
  3. 我刚刚证实它也发生在:image = ImageIO.read(file);- 我开始认为,它一定是 Java 之外的东西 - 一些有问题的本机库......

编辑2:

所以问题出在文件系统上——我有一个 7GB 的目录,里面有数千张图片。当我尝试读取文件时,它会消耗所有内存 - 我想这是某种文件系统问题。

4

3 回答 3

3

有一些与 ImageIO.read() 和 BufferedImage 相关的已知错误

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7166379

http://bugs.sun.com/view_bug.do?bug_id=6716560

于 2012-07-02T21:35:44.920 回答
1

BufferedImage 肯定有问题 - 我已经在两台服务器上测试过它,并且泄漏的结果相同 - 系统完全内存不足。

最后,我在 PHP 上编写了一个简单的包装器,现在我使用 GD 进行图像处理。现在工作正常。感谢所有的建议!

于 2012-06-08T22:46:13.223 回答
0

尝试将代码移至java.niomemory mapped file访问。这些存储在堆外。

这个SO很有趣。

于 2012-06-08T07:54:38.807 回答