2012-11-19 82 views
2

如何收集Java靜態類垃圾回收?Java靜態類生命週期

我有一個靜態類,它包含一個靜態對象。如果我將該對象設置爲null,那麼它將被垃圾收集。我不明白靜態類的生命週期。程序關閉時是否收集垃圾?

+2

取決於「靜態類」的含義。所有頂級類的行爲都像靜態類... –

回答

1

想想這樣:

每個對象都有一個對它的類的引用。

每個類都有一個對其類加載器的引用。

每個類加載器都有一個參考它曾經加載過的每個類

這可能是整個混亂的球變成垃圾。這是應用程序卸載/重新加載的基礎(在servlet容器中)。但是,如果甚至有一個對象仍然被引用,那麼類加載器及其所有類都不能被卸載,因此實現應用程序卸載並非易事。

+0

謝謝。我不認爲你知道這是否與.NET語言相同。我來自Java背景,但現在我正在用.NET語言進行編程。 – w0051977

+0

爲什麼不發佈.net問題。 – irreputable

+0

這是一個公平點。我更喜歡Java開發。 – w0051977

1

靜態類總是可訪問的,因此永遠不會垃圾收集。

現在,如果您的靜態類具有非靜態類的字段和實例並且設置爲null,那麼將釋放內存,因爲該對象不再被引用。

例如

public static StaticClass 
{ 
    public static InstanceClass myInstanceClass; 
} 

如果設置myInstanceClass爲null,那麼這將是垃圾收集。

+0

我明白myInstanceClass是如何以及何時收集垃圾的。我不明白什麼時候StaticClass被垃圾收集。當然,它必須從內存中卸載? – w0051977

+0

@ w0051977當你關閉程序時,它會是 –

+0

@ w0051977嘗試將你的靜態類設置爲null –

4

靜態對象與類定義綁定,而不與類實例綁定。

只要您的課程通過ClassLoader加載,它們就會生效並且只有在課程被卸載時纔會銷燬。

+0

謝謝,類何時卸載? – w0051977

+0

@ w0051977:當你的課程不在時上下文如果您是以獨立模式運行程序並終止程序,或者如果您有一個部署了靜態類的Web應用程序並且您未部署該應用程序。總之,當加載上下文本身被破壞時,它被卸載。 –

+0

謝謝,如果它是一個Web應用程序,那麼我認爲「加載上下文」是Windows進程? – w0051977

1

-static類可以只能在一流水平不包級別,我們可以說static inner classesTop level classes

- A static類然後由類加載器加載。

-現在static類將是到內存,直到裝載機已加載它仍在運行,除非它不是由裝載卸載。