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);也会发生这种情况image = ImageIO.read(file);

在第一个“无法分配内存”之前,我没有得到任何例外。

出于某种原因,在读取特定类型的图像时,图像的读取将以消耗的所有系统内存结束。 我不是在谈论堆,而是系统内存。

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

  1. 你知道为什么会这样吗?
  2. BufferedImage有什么替代方案,可能效果更好吗?
  3. 有问题的机器是虚拟服务器。 它可以由它的配置引起吗?

谢谢

编辑:

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

EDIT2:

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

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

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

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

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

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

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

这很有趣。