2017-06-06 42 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