2013-11-23 49 views
0

任何人都可以請告訴我什麼將與對象相互引用? java的GC如何解決這個問題?提前致謝!java GC如何清理相關對象

+0

是否有任何指向這些對象之一? –

+0

它沒有。仍然被引用的對象不會被丟棄。 –

+0

只要可以通過任何活動線程訪問垃圾,對象就不會被垃圾收集。 – Nishant

回答

5

如果你有對象A和B,如果滿足以下條件成立:

  • A引用到B
  • b號至A
  • 沒有其他對象引用
  • 它們中的任何一個
  • 他們不是根對象(在常量例如對象池等)

然後,這兩個對象將是垃圾回收。這被稱爲「循環參考」。

這是因爲mark-and-sweep GC會掃描並找出所有可從根對象訪問的對象。如果A和B在沒有任何外部參考的情況下相互參照,標記和掃描GC將無法將它們標記爲可達,因此將被選作GC的候選。

有許多不同的標記和掃描實現(天真標記和掃描,三色等)。但基本的想法是一樣的。如果無法通過直接/間接引用從根目錄訪問對象,它將被垃圾收集。

+0

Zhang說的是真實的。循環引用也稱爲對象島。根據所使用的GC收集器,所有這些島都標記並一起清理。但是如果任何物體泄漏了島上的參考,那麼沒有人會被GCed並永久保留在舊空間中。所以它實際上是一種折衷。 – Nazgul

0

有一些GC。在年輕一代,有一個複製收藏家。

這樣做是找到從「根」對象引用的所有對象,例如線程堆棧。例如伊甸園空間被複制到倖存者空間,倖存者空間相互複製。任何未清的東西都會被清除。

這意味着如果您有一組彼此相互引用的對象,並且沒有任何對象的強引用,它們將在下一個集合中被丟棄。 (GC可以選擇保留它們的軟參考例外)