[英]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 中没有允许您缩小缓冲区的方法。 重置更改缓冲区中的位置。
您的解决方案是
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.