BufferedImage漏洞 - 还有其他选择吗?

时间:2012-06-05 23:05:24

标签: java image memory-leaks bufferedimage

我遇到了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. 有问题的机器是虚拟服务器。可以由它的配置引起吗?
  4. 由于

    编辑:

    1. 示例图片:http://cl.ly/1P430l0V1g133r0C291J
    2. 这只是第一个也是唯一一个会产生这种情况的实例。
    3. 我刚刚确认它也发生在:image = ImageIO.read(file); - 我开始认为,它必须是Java之外的东西 - 一些本地库,它是错误的......
    4. EDIT2:

      问题在于FileSystem - 我有一个7GB目录,里面有成千上万的图像。当我尝试读取文件时,它会消耗所有内存 - 我想这是某种文件系统问题。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

尝试将代码移至java.niomemory mapped file访问权限。它们存储在堆外。

这个SO很有意思。