Java BuffereImage泄漏-是否有其他选择?
我在BuffereImage方面遇到了奇怪的问题,在某些情况下,它会消耗所有可用的系统内存3GB,1.5GB 我已经创建了一个简单的包装器,使用方法如下:Java BuffereImage泄漏-是否有其他选择?,java,image,memory-leaks,bufferedimage,Java,Image,Memory Leaks,Bufferedimage,我在BuffereImage方面遇到了奇怪的问题,在某些情况下,它会消耗所有可用的系统内存3GB,1.5GB 我已经创建了一个简单的包装器,使用方法如下: public ImageWrapper(final byte[] bytes) throws ImageWrapperException { this(new ByteArrayInputStream(bytes)); } public ImageWrapper(final ByteArrayInputStream bis) t
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);
}
}
我已经用jsut验证过,即使使用image=ImageIO.readfile也会发生这种情况
我不会得到任何异常,直到第一个无法分配内存
由于某些原因,在读取特定类型的图像时,图像的读取最终将消耗所有系统内存。我说的不是堆,而是系统内存
它只发生在某些环境中——它不会发生在我的OSX上,但会发生在我的Debian服务器上
你知道为什么会这样吗?
BuffereImage是否有其他更好的替代方案?
有问题的机器是一个虚拟服务器。这可能是由其配置引起的吗?
谢谢
编辑:
示例图像:
这只是第一个也是唯一一个产生这种现象的例子。
我刚刚验证了:image=ImageIO.readfile;-我开始想,它一定是Java之外的东西——一些有缺陷的本机库。。。
编辑2:
所以问题在于文件系统——我有一个7GB的目录,里面有数千个图像。当我试图读取一个文件时,它会消耗所有的内存——我想这是某种文件系统问题 尝试将代码移动到java.nio和内存映射文件访问。这些存储在堆外
这很有趣。尝试将代码移动到java.nio和内存映射文件访问。这些存储在堆外
这很有趣。BuffereImage肯定有问题-我在两台服务器上测试了它,结果相同-系统完全内存不足
最后,我在PHP上编写了一个简单的包装器,现在我使用GD进行图像处理。现在一切正常。谢谢你的建议 BuffereImage肯定有问题-我在两台服务器上测试过,结果都是一样的-系统内存完全不足
最后,我在PHP上编写了一个简单的包装器,现在我使用GD进行图像处理。现在一切正常。谢谢你的建议 存在一些与ImageIO.read和BuffereImage相关的已知错误
存在一些与ImageIO.read和BuffereImage相关的已知错误
什么类型的图像?你能发布一个这样的图像的二进制1:1副本吗?您如何在周围的代码中使用ImageWrapper,有多少实例,等等。?请发布更多的代码。特别是如果您调整大小,请使用第一个可用于图像类型的ImageReader将ImageIO.read拆分为。这避免了BuffereImage内存的使用。顺便说一句,在最后一个街区结束。菲利普:看我的更新。Joop:即使不进行任何大小调整或保存,也会发生这种情况。即使我没有做bis.close,我也看不出任何原因,为什么进程会消耗1.5 GB的内存。@Vojtěch:您如何准确地衡量内存使用情况?Linux上的内存测量并不像看上去那么简单……你是说,如果你编写的类有一个main方法public static void mainString[]args{Image Image Image=ImageIO.readargs[0];}并传入你链接的图像的文件名,它会为你复制这个吗?什么特定类型的图像?你能发布一个这样的图像的二进制1:1副本吗?您如何在周围的代码中使用ImageWrapper,有多少实例,等等。?请发布更多的代码。特别是如果您调整大小,请使用第一个可用于图像类型的ImageReader将ImageIO.read拆分为。这避免了BuffereImage内存的使用。顺便说一句,在最后一个街区结束。菲利普:看我的更新。Joop:即使不进行任何大小调整或保存,也会发生这种情况。即使我没有做bis.close,我也看不出任何原因,为什么进程会消耗1.5 GB的内存。@Vojtěch:您如何准确地衡量内存使用情况?Linux上的内存测量并不像看上去那么简单…你是说如果你编写一个类,它有一个main方法public static void mainString[]args{Image Image=ImageIO.readargs[0];}并传入你链接的图像的文件名,它会为你复制这个吗?问题不在堆中,本机代码中存在一些问题,因为整个系统内存不足。问题不在堆中,本机代码中存在一些问题,因为整个系统内存不足。