仅在调试模式下内存泄漏

Memory leak in debug mode only

我有这个代码:

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:

The tricky point is that a variable is eligible to be dead once it’s not used anymore. However, it’s up to JIT to determine whether it really wants to report the variable to be dead. In fact, for debuggable code, JIT extends lifetime for every variable to end of the function.

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

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