1

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

我创建了一个新的 bytearrayoutputstream

ByteArrayOutputStream byteArray = new ByteArrayOutputStream();

没什么特别的。然后,当我向它写入图像时,这样

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

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

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

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

System.gc();

在这种情况下无济于事。

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

4

4 回答 4

0

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

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

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

于 2012-08-14T17:58:32.807 回答
0

你有没有试过这个:

 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());
}
于 2012-08-14T18:09:12.213 回答
0

请参考我发布到另一个 ByteArrayOutputStream question 的类似答案

ByteArrayOutputStream 中没有允许您缩小缓冲区的方法。重置更改缓冲区中的位置

你的解决方案是

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

你在做什么没有任何意义。您正在从内存中取出图像并再次将其放入内存,这次是作为字节数组。

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

于 2012-10-26T15:43:37.940 回答