2012-01-09 79 views
3

有人告訴我,只有當一個引用被設置爲null時,垃圾收集器纔會收集它。不過,我認爲垃圾收集器將收集所有超出範圍的引用,它們從來沒有被設置爲null。什麼時候對象引用會被垃圾回收?

任何人都可以告訴我什麼時候垃圾收集器會引用一個引用?

+4

「某人」是錯誤的。 – SLaks 2012-01-09 15:07:46

回答

9

GC收集對象,未引用。

GC在沒有更多實時引用後會收集對象一段時間。 (GC處於不確定性)

+1

+1:沒有強引用的對象可以被GCed。 – 2012-01-09 15:09:42

+0

如果將引用設置爲null,是否有助於觸發gc? – user705414 2012-01-09 15:10:47

+0

@ user705414:不(這就是爲什麼它說它是非確定性的)。 – Groo 2012-01-09 15:19:46

2

什麼是有人大概的意思是,你可以讓GC收集的對象時,它超出範圍通過設置擁有引用該對象null變量之前。對於一些非常罕見的情況(例如,在沒有引用對象的長時間運行的循環之前),這種技術在過去是有價值的。現在的編譯器技術使得這個想法實際上沒有用處,因爲編譯器足夠聰明以檢測這些情況並採取相應的行動。

0

GC將從內存中刪除一個對象「當它需要」。你可以嘗試運行System.gc(),但它只是提示GC應該運行。 GC運行時,它會查找未引用的對象(或僅具有弱引用等的對象)。 GC在內存空間上運行頻率降低。它經常在伊甸園空間運行。默認情況下,GC在eden空間中運行時會運行,但您可以調整JVM。

爲什麼你首先在煩擾GC?你怎麼了?