仅在调试模式下内存泄漏

时间:2017-06-06 01:49:27

标签: c# json.net dotnetzip

我有这段代码:

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语句中执行的。

1 个答案:

答案 0 :(得分:2)

尝试将代码包装到函数中。

看看this blogpost

  

棘手的一点是,变量一旦被认定就有资格死亡   不再使用了。但是,由JIT确定是否可以   真的想报告变量是死的。事实上,为   可调试代码,JIT将每个变量的生命周期延长到   功能

这意味着您的变量不会被GC.Collect收集,因为您的变量位于同一个函数中且调试时仍在范围内。

请记住:垃圾收集器只删除未使用的变量(不在范围内)。 using仅在对象上调用Dispose