首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java ByteArrayOutputStream内存泄漏

Java ByteArrayOutputStream内存泄漏
EN

Stack Overflow用户
提问于 2012-08-15 01:54:42
回答 4查看 1.9K关注 0票数 1

我提出了一个新问题,因为这与我上一个帖子不同。我现在知道哪个问题更准确了。

我创建一个新的bytearrayoutputstream

代码语言:javascript
复制
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();

没有什么特别事情。然后,当我向它写入一个图像时,这样

代码语言:javascript
复制
ImageIO.write(image, "gif", byteArray);

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

过了一段时间,它停止工作,有点崩溃。

我试着关闭它,刷新,重置,所有的一切,但它仍然会泄漏内存。当我停止使用byteArray或将其设为空时,我希望它能从内存中消失。

代码语言:javascript
复制
System.gc();

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

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

EN

回答 4

Stack Overflow用户

发布于 2012-08-15 01:58:33

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

代码语言:javascript
复制
while( keepRunning) {
     ByteArrayOutputStream byteArray = new ByteArrayOutputStream();   
     ImageIO.write(image, "gif", byteArray);
}

如果您这样做的速度超过了JVM收集垃圾的速度,那么您最终会得到一个非常长的GC暂停或OutOfMemory异常。

票数 0
EN

Stack Overflow用户

发布于 2012-08-15 02:09:12

你有没有试过这个:

代码语言:javascript
复制
 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());
}
票数 0
EN

Stack Overflow用户

发布于 2012-10-26 23:43:38

你的所作所为没有任何意义。您将图像从内存中取出,并再次将其放入内存中,这次是以字节数组的形式。

您应该将该图像放入文件中或通过网络发送。或者,如果您只想保存一份副本,请复制图像(而不是字节数组!)就像我在这里描述的:Bug in using Object.clone()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11957981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档