垃圾收集器何时回收字符串和静态字段?
我问这个是因为我知道ASP.NET中的static
总是有效的。
答案 0 :(得分:5)
垃圾收集器仅收集不可访问的对象。静态字段引用的对象一旦加载其类就可以访问,因此显然不会被收集(除非该字段设置为引用其他内容,导致原始对象可能有资格进行收集)。
至于字符串,取决于。文字字符串是固定的,因此始终可访问。否则,适用与任何对象相同的规则。
答案 1 :(得分:3)
字符串是对象,将在未引用时收集。
静态字段通常保留对对象的永久引用,从而防止这些对象被收集。但只要你仍然需要那些非常好的物品。
答案 2 :(得分:2)
引用对象的任何static
字段都将阻止收集该对象,因为static
字段与类的Type
对象关联。反过来又与AppDomain
相关联,因此将作为GC根源。
对于strings
,它取决于它是否已被实习。如果有,则当前AppDomain
的实习池将引用它,从而阻止收集。如果没有,那么string
将表现得像任何其他类对象一样,并且当不再可以通过GC根目录的链引用访问时,它有资格进行收集。
请注意,在这两种情况下,如果卸载AppDomain
,对象将有资格进行收集。
答案 3 :(得分:1)
不,垃圾收集器不会收集静态字段。通常,只要您的类的实例存在并且指向它将保留,垃圾收集将不会收集您的类。