2017-06-06 67 views
1

我有這樣的代碼:內存泄漏只

using (var memoryStream = new MemoryStream()) 
{ 
    using (var streamWriter = new StreamWriter(memoryStream)) 
    { 
     var list = new List<Actor>(); 
     for (var i = 0; i < 1000000; i++) 
     { 
      list.Add(new Actor("lorem ipsum")); 
     } 

     using (var serializedContent = new MemoryStream()) 
     { 
      streamWriter.WriteLine(JsonConvert.SerializeObject(list)); 
      streamWriter.Flush(); 
      serializedContent.Seek(0, SeekOrigin.Begin); 
      using (ZipFile zip = new ZipFile()) 
      { 
       zip.AddEntry("message.txt", serializedContent); 
       zip.Save("Archive.zip"); 
      } 
     } 
    } 
} 

while (true) 
{ 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
    GC.WaitForFullGCComplete(); 
    GC.Collect(); 
    Console.WriteLine("completed"); 
    Console.ReadKey(); 
} 

的問題是內存泄漏只出現在調試版本,而在它發佈後,充分清洗自己。任何想法爲什麼會發生這種情況?

編輯。 我注意到問題消失,如果我刪除那部分,我嘗試將文件添加到zip壓縮文件。調試版本與發行版本之間有什麼區別?我看不到問題,因爲歸檔部分在using聲明中執行。

+0

演員的執行是什麼?什麼泄漏?你是否描述過它? –

+0

Actor類有一個字符串變量保存它的名字,沒有別的。 – martynaspikunas

回答

1

嘗試將您的代碼包裝到函數中。

看看this blogpost

棘手的一點是,一個變量有資格成爲死,一旦它 不再使用。但是,由JIT決定它是否真的想要報告該變量已經死亡。事實上,對於 可調試代碼,JIT將每個變量的生命週期延長到 函數的結尾。

這意味着您的變量將不會被GC.Collect收集,因爲您的變量位於相同的函數中,並且調試時間仍在範圍之內。

切記:垃圾回收器只會移除未使用的變量(不在範圍內)。 using僅在對象上調用Dispose

+1

起初它沒有工作,但後來我意識到,我將我的代碼包裝成靜態方法。謝謝! – martynaspikunas