我做了一个新的问题,因为这是从我的最后一个线程不同。 我现在知道了前作的问题是什么更准确。
我创建了一个新的bytearrayoutputstream
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
没什么特别的。 然后,当我写它的图像,这种方法
ImageIO.write(image, "gif", byteArray);
存储器增加像100 MB的第一,而不是在蚀,但在“现实”。 然后,每次我写一个新的图像到流或其他以后再慢慢增加!
并在一段时间后停止工作,有点崩溃。
我试图关闭它,所有这一切,潮红,正在重置,一切,但它仍然出现内存泄漏。 我想让它变得从内存中离开时,我停止使用ByteArray或空它。
System.gc();
不会在这种情况下帮助。
请帮我和其他任何你需要知道我要回答,请返回并回信:)
您的使用模式应该是这样的:
while( keepRunning) {
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
ImageIO.write(image, "gif", byteArray);
}
如果你这样做快于JVM可以收集垃圾,你会最终得到一个很长的GC暂停或内存不足异常。
你有没有试过这样:
try{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "png", baos);
baos.flush();
byte[] imageBytes = baos.toByteArray();
baos.close();
}catch(Exception ex){
System.out.println(ex.getMessage());
}
你在做什么并没有任何意义。 你把图像了内存,放入内存,这一次的字节数组。
你应该把该图像到文件或通过网络发送。 或者,如果你想牵住一个副本,就像我在这里描述的复制图像(不是字节数组!): 错误使用Object.clone()
请参考一个类似的答案我张贴到另一个ByteArrayOutputStream问题 。
有一个在ByteArrayOutputStream没有一种方法,使您可以收缩的缓冲区。 复位改变在缓冲器中的位置 。
为您解决的办法是
- 使用构造使用前指定缓冲区的大小。 当你写大对象数据流,这将节省大量的存储空间,从而OOM异常。
- 如果你想重用你的BAOS对象,调用复位。 这将使接下来的写入开始在缓冲区的开始。
- 释放内存的唯一方法是删除所有引用。 在上面的代码,你会说的ByteArray = NULL;