我在使用 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服务器上。
- 你知道为什么会发生这种情况吗?
- 有没有 BufferedImage 的替代品,可能效果更好?
- 有问题的机器是虚拟服务器。会不会是它的配置造成的?
谢谢
编辑:
- 示例图片:http ://cl.ly/1P430l0V1g133r0C291J
- 它只是第一个也是唯一一个会产生这个的实例。
- 我刚刚证实它也发生在:
image = ImageIO.read(file);
- 我开始认为,它一定是 Java 之外的东西 - 一些有问题的本机库......
编辑2:
所以问题出在文件系统上——我有一个 7GB 的目录,里面有数千张图片。当我尝试读取文件时,它会消耗所有内存 - 我想这是某种文件系统问题。