[英]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.