2011-07-29 41 views
5

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

我在问这个,因为我知道ASP.NET中的static一直是活的。

+2

对于'static'的答案,请参见[here](http://stackoverflow.com/questions/6600093/do-static-members-ever-get-garbage-collected) – dlev

+1

他们是,但不是GC 。它需要AppDomain.Unload()。 ASP.NET大量使用AD,确切的规则对我来说有点神秘。希望这个评论能以正确的方式引导答案,只有最低投票答案提到他们。 –

回答

3

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

静态字段通常保持对对象的永久引用,从而避免收集这些对象。但只要你仍然需要那些完全没问题的物体。

1

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

5

垃圾收集器只收集非可访问的对象。静态字段所引用的对象在其类被加载后即可访问,因此它显然不会被收集(除非字段被设置为引用其他内容,导致原始对象成为可能有资格收集)。

至于字符串,它取决于。字符串是实现的,因此始终可以访问。否则,相同的规则适用于任何对象。

2

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

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

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