2011-09-08 100 views
2

我讀this由於我在我的代碼與弱引用,當我遇到這個小紙條來有一些內存的問題:使用WeakReference時,在Java中使用後必須設置爲null的強引用?

你必須明確地設置強引用無效使用後:

這個不是很明顯:你可能會認爲一旦超出範圍,強參考就不復存在。但是,JVM不需要這麼做,出於效率考慮,不會這樣做。強引用保留在堆棧框架中,並可能妨礙垃圾收集。

這是真的嗎?如果我這樣做:

void foo(){ 
    Object obj = weakRef.get(); 
    doStuffWith(obj); 
} 

需要它,我設置obj = null當我用的方法進行,否則我會泄露OBJ?

+7

不,你不必設置爲空引用。您所引用的部分是書面的誤導性內容:它屬於「斷路器」示例,該示例出現幾段。我不確定何時/爲何移動它,但會編輯文檔並重新發布。 – kdgregory

+0

@kdgregory - 當您有機會時,隨時將您的評論移至答案。 –

+0

@kdgregory「現在你需要知道的只是Java使用了一種標記清除緊湊垃圾回收的形式」這完全取決於實現,甚至實際上在今天看着Hotspot表明這不是真的(這裏有六十多種不同的算法,上帝知道現在有多少種可能的組合)。或者更重要:默認情況下,年輕一代使用停止和複製gc。 – Voo

回答

0

的確,JVM並不需要這樣做。事實上,JVM根本不需要做GC。

但是,不會使本地引用無效的JVM與不執行GC的JVM一樣不合理。

(當然,還有人誰給巨大的內存JVM,並徹底關閉GC,他們只是重新啓動應用程序每N天)。

相關問題