2011-07-29 42 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被卸載,對象將有資格收集。