Java的BufferedArrayOutputStream泄漏内存(Java BufferedAr

2019-09-28 11:12发布

我做了一个新的问题,因为这是从我的最后一个线程不同。 我现在知道了前作的问题是什么更准确。

我创建了一个新的bytearrayoutputstream

ByteArrayOutputStream byteArray = new ByteArrayOutputStream();

没什么特别的。 然后,当我写它的图像,这种方法

ImageIO.write(image, "gif", byteArray);

存储器增加像100 MB的第一,而不是在蚀,但在“现实”。 然后,每次我写一个新的图像到流或其他以后再慢慢增加!

并在一段时间后停止工作,有点崩溃。

我试图关闭它,所有这一切,潮红,正在重置,一切,但它仍然出现内存泄漏。 我想让它变得从内存中离开时,我停止使用ByteArray或空它。

System.gc();

不会在这种情况下帮助。

请帮我和其他任何你需要知道我要回答,请返回并回信:)

Answer 1:

您的使用模式应该是这样的:

while( keepRunning) {
     ByteArrayOutputStream byteArray = new ByteArrayOutputStream();   
     ImageIO.write(image, "gif", byteArray);
}

如果你这样做快于JVM可以收集垃圾,你会最终得到一个很长的GC暂停或内存不足异常。



Answer 2:

你有没有试过这样:

 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());
}


Answer 3:

你在做什么并没有任何意义。 你把图像了内存,放入内存,这一次的字节数组。

你应该把该图像到文件或通过网络发送。 或者,如果你想牵住一个副本,就像我在这里描述的复制图像(不是字节数组!): 错误使用Object.clone()



Answer 4:

请参考一个类似的答案我张贴到另一个ByteArrayOutputStream问题 。

有一个在ByteArrayOutputStream没有一种方法,使您可以收缩的缓冲区。 复位改变在缓冲器的位置

为您解决的办法是

  1. 使用构造使用前指定缓冲区的大小。 当你写大对象数据流,这将节省大量的存储空间,从而OOM异常。
  2. 如果你想重用你的BAOS对象,调用复位。 这将使接下来的写入开始在缓冲区的开始。
  3. 释放内存的唯一方法是删除所有引用。 在上面的代码,你会说的ByteArray = NULL;


文章来源: Java BufferedArrayOutputStream leaks in memory