繁体   English   中英

Java ByteArrayOutputStream 在内存中泄漏

[英]Java ByteArrayOutputStream leaks in memory

我提出了一个新问题,因为这与我的上一个线程不同。 我现在知道更确切的问题是什么。

我创建了一个新的 bytearrayoutputstream

ByteArrayOutputStream byteArray = new ByteArrayOutputStream();

没什么特别的。 然后,当我给它写一个图像时,这样

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

内存首先增加 100 mb,不是在日食中,而是在“现实”中。 然后每次我向该流或另一个流写入新图像时它会慢慢增加!!

一段时间后它停止工作并且有点崩溃。

我试过关闭它和所有这些,刷新,重置,一切,但它仍然泄漏内存。 当我停止使用 byteArray 或将其设为 null 时,我希望它远离内存。

System.gc();

在这种情况下不会有帮助。

请帮助我以及您需要知道的任何其他信息,我会回答,请返回并回复:)

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

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

如果你这样做的速度比 JVM 收集垃圾的速度快,你最终会得到一个很长的 GC 暂停或 OutOfMemory 异常。

你有没有试过这个:

 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 中没有允许您缩小缓冲区的方法。 重置更改缓冲区中位置

您的解决方案是

  1. 使用前使用构造函数指定缓冲区的大小。 当您将大对象写入流时,这将节省大量内存并防止 OOM 异常。
  2. 如果您想重用您的 BAOS 对象,请调用 reset。 这将使下一次写入在缓冲区的开头开始。
  3. 释放内存的唯一方法是删除对它的所有引用。 在上面的代码中,你会说 byteArray=null;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM