2012-08-10 66 views
3
class StaticTest{ 

public static SomeClass statVar = new SomeClass(); 

} 

之後如果我們訪問StaticTest.statVar並隨機分配一些新對象,那麼當所有這些對象都會被垃圾回收?答:正常垃圾收集時間。由靜態變量引用的對象的垃圾收集

但是,如果這個statVar引用了一些實例變量(對象)呢?

不清楚?好吧,靜態變量的生命期是直到類卸載。在Web應用程序中,我們正在靜態環境中初始化許多事情。如果我們爲這個靜態上下文提供了一些對象引用,但我們沒有釋放它們,那麼它如何被垃圾回收呢?

我很樂意就此進行討論。

+1

你的問題目前還不清楚......如果你能提供一個具體問題的完整具體例子,這真的會有所幫助。 – 2012-08-10 19:54:11

+0

「不釋放它們」是什麼意思?如果某個東西引用了一個值,它將不會被GCed。如果沒有提到它,它可能是。 – 2012-08-10 19:56:36

+0

感謝您的所有答案。我有一些設計問題。對於每個請求都有對象被創建。所有請求的上下文都是相同的。如果通過上下文(Static here)變量給請求對象引用,那麼在服務器重啓之前這些對象從不會被垃圾回收?正確? – 2012-08-11 15:31:44

回答

4

靜態變量引用的對象將在類卸載時被垃圾回收。所以,靜態引用所引用的對象將不會被GCed,直到類被卸載(因爲對於堆中的對象總是有可達的引用)。

+0

......在許多情況下,這種情況實際上從來沒有。請參閱http://stackoverflow.com/questions/148681/unloading-classes-in-java – yshavit 2012-08-10 19:55:09

+0

內容不是靜態的。引用對象的變量是靜態的,引用對象本身不是。 – 2012-08-10 19:55:17

+1

@Andreas_D:我總是在那裏輸入內容,並且始終突出顯示它。下一次,我會在答案中確定無字詞內容。 – kosa 2012-08-10 19:56:59

0

想想內存中的對象,而不是變量。 statVar是對內存中某個對象的引用。如果您保留對其他地方的同一個對象的引用,那麼該對象將不會被GC'd直到該引用被釋放。班級卸載和statVar消失無關緊要,因爲這只是另一個參考對象,仍然有參考生活。所以在這種情況下不會被清理。

0

靜態對象引用通常被認爲是GC根,無論它們指向什麼(以及被這些對象綁定的任何東西)都將被視爲活動的。如果你想讓它所引用的對象成爲垃圾收集的對象,你需要清除對它們的引用(當然也包括所有其他引用)。

如果類不再被引用您的JVM設置收集未使用的類,thinksteep的回答適用。我不會屏住呼吸等待那一刻。

只要你保留引用的數據,答案就是它們不會被清除。當你有GC時,這是協議最基本的部分。

作爲一個方面說明,我很少認爲將事情放在web應用程序的靜態上下文中是一個好主意,除非它是單例對象或由該web-app的所有用戶共享的東西。在這種情況下,只要應用程序服務器正在運行,爲什麼要將其清理?這沒有意義。