c# - 仅在 Debug模式下发生内存泄漏

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

最佳答案

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

看看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

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

相关文章:

c# - 如何对使用 dotnet Zip 创建的 zip 文件中包含的文件下订单

c# - 如何使用 ActionLink 生成哈希

c# - 如何使用兼容Android的C#读写NDEF格式的NFC标签?

c# - 我如何告诉 Dapper 在使用 "WHERE"的 "IN"子句中使用 varchar 作为参数列表?

c# - 设置 Asp.Net Core MVC Json 选项

c# - 当内部属性名称不同时反序列化 JSON

c# - 如何使用嵌套的对象数组反序列化 JSON 数组

c# - 从 dotnetzip 创建的 zip 文件中提取时出错 - "Windows cannot complete the extraction."

c# - 无法解压缩 ZLIB/DEFLATE 数据

c# - 使用 C# 获取文件夹中包含大小的文件元数据的快速方法是什么?