c# - 垃圾收集不工作 int .net c#

标签 c# .net garbage-collection

我以这段代码为例:

var p = new person("Amir");
var zp = new person("Amiraa");
GC.Collect();
GC.WaitForPendingFinalizers();

class person
{
    public person(string nName)
    {
        Console.WriteLine("New");
        string name = nName;
    }

    ~person()
    {
        Console.WriteLine("Garbage collected");
    }
}

但是控制台上的结果只显示“New”,而不是“Garbage collected”。那么为什么 gc 不工作?

最佳答案

试一试,您会发现您的代码在 Release 中按预期工作, 但不一定 Debug .

这是因为变量 pzp 在您调用 GC.Collect() 时仍在范围内。他们仍然引用 person 实例。

在 Release 中,GC 会很高兴地收集仍在范围内的变量引用的对象,只要它们不再被使用即可。在 Debug 中,调试器需要让你查看范围内的所有变量的内容,这样 GC 就无法收集它们。

如果你这样做:

var p = new person("Amir");
var zp = new person("Amiraa");

p = null;
zp = null;

GC.Collect();
GC.WaitForPendingFinalizers();

你会看到 the output you expect ,即使在调试中。请注意,.NET 6 中引入的分层编译会影响这一点,并且上述测试可能无法按预期进行。

如果你引入一个单独的方法,那么 pzp 的生命周期被显式限定,你应该甚至在 .NET 6 in Debug 上看到预期的行为。 :

Test();
GC.Collect();
GC.WaitForPendingFinalizers();

void Test()
{
    var p = new person("Amir");
    var zp = new person("Amiraa");
}

关于c# - 垃圾收集不工作 int .net c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70678955/

相关文章:

.net - .NET 2 或 .NET 4 中的 msxsl 内存泄漏错误是否已修复?

c# - 通过 lambda 表达式在运行时获取局部变量(和参数)的名称

c# - 为什么使用对象初始值设定项可以使对象保持事件状态?

JavaScript - 函数调用后的垃圾收集

Javascript - 将 ISO8601 UTC 时间转换为客户端的本地时间

c# - 如何按周对日期进行分组?

C# 多列列表框

.net - WPF - 在 SYSTEM 帐户下执行进程时性能低下

ruby c 扩展如何管理 2 个对象之间的垃圾回收

c# - .NET Core 中的 CORS