簡體   English   中英

MemoryStream使用過多的內存,並且不會處理/關閉

[英]MemoryStream uses too much memory and doesn't dispose/close

內存使用率會上升,直到遇到System.OutOfMemory異常。 MemoryStream實例的數量也會增加,直到異常發生為止。 我嘗試使用using() ,執行ms.Dispose(),ms.Close()以及其他一些操作,例如GC.Collect()等。這是否可能是內存泄漏?

  while(running){ 
var screen = Screen.PrimaryScreen;
                using(Bitmap bitmap = new Bitmap(screen.Bounds.Width, screen.Bounds.Height)) {
                    using(var g = Graphics.FromImage(bitmap)) {
                        g.CopyFromScreen(screen.Bounds.Left, screen.Bounds.Top, 0, 0, screen.Bounds.Size);
                    }
                    using(EncoderParameters encoderParams = new EncoderParameters(1)) {
                        encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, ssQuality);
                        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
                        ImageCodecInfo jgpEncoder = codecs[1];
                        using(var ms = new MemoryStream()) {
                            bitmap.Save(ms, jgpEncoder, encoderParams);
                            image img2 = new image();
                            img2.Img = Image.FromStream(ms);
                            binF.Serialize(client.GetStream(), img2);
                        }
                    }
                }
}

VS內存視圖:

內存視圖VS

任務管理器的內存使用過程:

任務管理器進程的內存使用情況

您需要處理從Image.FromStream(ms);返回的圖像Image.FromStream(ms); ,例如:

ms.Position = 0; // Rewind the stream.
using (var image2 = Image.FromStream(ms)) 
{ 
    image img2 = new image { Img = image2 };
    binF.Serialize(client.GetStream(), img2);
}

這將確保不僅迅速處置第二個映像的資源,而且更可能迅速對垃圾流MemoryStream ms進行垃圾回收。 當前不會發生這種情況,因為Image保留對創建它的流的引用。 這在文檔中提到:

您必須在圖像的生命周期內保持流打開。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM