c# - 垃圾收集 - 一个有效但另一个无效,怎么会这样?

标签 c# garbage-collection

<分区>

所以我有一个简单的 Bell 类,我正在其上测试垃圾收集:

public class Bell
{
    public void Ring()
    {
        Console.WriteLine("Ding ding");
    }
}

如果我在下面运行这段代码,它不会被垃圾回收

class Program
{
    private static WeakReference reference;

    private static void Main()
    {
        Console.WriteLine("Starting");

        var bell = new Bell();
        reference = new WeakReference(bell);
        bell = null;

        GC.Collect();

        Console.WriteLine("Object still alive: {0}", reference.IsAlive);

        if (reference.Target == null)
        {
            Console.WriteLine("Bell is no more!");
        }
        else
        {
            {
                var theBell = (Bell)reference.Target;
                theBell.Ring();
            }
        }

        Console.ReadLine();
    }
}

如果我只检查 reference.IsAlive 如下所示,它是垃圾收集

class Program
{
    private static WeakReference reference;

    private static void Main()
    {
        Console.WriteLine("Starting");

        var bell = new Bell();
        reference = new WeakReference(bell);
        bell = null;

        GC.Collect();

        Console.WriteLine("Object still alive: {0}", reference.IsAlive);

        Console.ReadLine();
    }
}

你们能给我解释一下这是如何工作的吗?

最佳答案

您正在尝试使用 Debug模式对其进行测试。 GC 在 Debug模式下并不积极,因为它在 Release模式下运行(优化开关打开)。这使得调试变得容易,否则你会在调试时发现奇怪的东西。例如:您可以尝试检查已被垃圾收集的变量的值。

在 Release模式下运行代码,您可以看到 Bell 将被 GC。

关于c# - 垃圾收集 - 一个有效但另一个无效,怎么会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28473221/

相关文章:

c# - 单独线程中的静态记录器?

c# - 如何降低统一的不透明度?

c# - 桌面 Java 应用程序替代方案

c# - 如何为 C# 模式配置 Emacs speedbar?

c# - 我无法让页面从 cookie 加载用户角色

java - 实例变量对静态变量保持强引用是否会导致内存泄漏?

java - JVM 一遍又一遍地进行次要垃圾收集,从不抛出 OutOfMemoryError

PHP 垃圾收集器统计

java - 分析工具如何在某些按钮单击或拍摄堆快照时执行垃圾收集?

javascript - 减少 Javascript 中垃圾收集器事件的最佳实践