我有以下代码:

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

最佳答案

尝试将您的代码包装到一个函数中。

看一下this blogpost


  棘手的一点是,变量一旦
  不再使用了。但是,由JIT来确定是否
  真的想报告变量已死。实际上,对于
  可调试代码,JIT将每个变量的生存期延长到
  功能。


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

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

关于c# - 仅在 Debug模式下发生内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44380194/

10-10 07:47