是否收集了字符串和静态字段?

时间:2011-07-29 20:21:50

标签: c# .net clr

垃圾收集器何时回收字符串和静态字段?

我问这个是因为我知道ASP.NET中的static总是有效的。

4 个答案:

答案 0 :(得分:5)

垃圾收集器仅收集不可访问的对象。静态字段引用的对象一旦加载其类就可以访问,因此显然不会被收集(除非该字段设置为引用其他内容,导致原始对象可能有资格进行收集)。

至于字符串,取决于。文字字符串是固定的,因此始终可访问。否则,适用与任何对象相同的规则。

答案 1 :(得分:3)

字符串是对象,将在未引用时收集。

静态字段通常保留对对象的永久引用,从而防止这些对象被收集。但只要你仍然需要那些非常好的物品。

答案 2 :(得分:2)

引用对象的任何static字段都将阻止收集该对象,因为static字段与类的Type对象关联。反过来又与AppDomain相关联,因此将作为GC根源。

对于strings,它取决于它是否已被实习。如果有,则当前AppDomain的实习池将引用它,从而阻止收集。如果没有,那么string将表现得像任何其他类对象一样,并且当不再可以通过GC根目录的链引用访问时,它有资格进行收集。

请注意,在这两种情况下,如果卸载AppDomain,对象将有资格进行收集。

答案 3 :(得分:1)

不,垃圾收集器不会收集静态字段。通常,只要您的类的实例存在并且指向它将保留,垃圾收集将不会收集您的类。