对于在C#/ VB.NET中具有静态方法的类,如何进行垃圾收集?

时间:2009-11-30 17:39:39

标签: c# garbage-collection

将对象设置为null会使GC标记为GC吗?

编辑:一个类有多个静态方法。在程序中使用这些方法时,确保在某个点之后将对象标记为GC的最佳方法是什么?

4 个答案:

答案 0 :(得分:11)

方法根本不是垃圾收集 - 所以你的问题意味着什么并不是很清楚。

同样,您从未将对象设置为null。您可以将变量的值设为null,但这对该变量先前引用的任何对象都没有任何意义。它只是意味着下次垃圾收集器查找活动对象时,该变量不会将任何对象提供给必须在GC结束时保持活动状态的对象集。

我建议您阅读Jeffrey Richter's article on garbage collection了解更多背景信息,然后在掌握基本知识时再询问任何进一步的具体问题。

答案 1 :(得分:4)

如果您询问静态方法中变量引用的对象会发生什么变化,那么当这些对象不再在范围内时,这些对象变得可以进行垃圾收集。

如果你在谈论静态字段引用的对象,那么简单来说,这些对象在被引用设置为null之前不会被收集。

以下示例可以更好地说明这一点:

class Example
{
    private static object field1 = new object();

    public static void SomeMethod()
    {
        object variable1 = new object();

        // ...
    }

    public static void Deref()
    {
        field1 = null;
    }
}

field1 引用的对象将在加载类时创建,并且即使在创建和销毁类Example的对象时也将保持root。收集该对象垃圾的唯一方法是调用Deref()方法,该方法通过将引用设置为null来取消引用它。 (实际上,可以通过卸载应用程序域来卸载类,但这有点更高级,而不是经常遇到的问题。)

相反,静态方法SomeMethod()创建一个对象,并通过变量 variable1 引用它。一旦超出范围(在方法结束时),该对象就可以进行垃圾收集。实际上,如果方法的其余部分没有引用它,可以提前收集它。

答案 2 :(得分:3)

对象未标记 GC,它们被标记(通过引用或指向它们的变量的存在)到 NOT < / em> 收集垃圾。当所有正在运行的线程,所有全局静态变量以及所有cpu寄存器中的对象的每个变量或引用都被删除,超出范围或被设置为null时,该对象将不再可访问,并且GC会收集它。

答案 3 :(得分:0)

将静态方法视为 class 方法。无论对象是否存在,它们都可用。它们对垃圾收集没有影响。