簡體   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