2011-04-14 24 views

回答

19

當不再有任何引用變量引用它時,或者當它在孤島中孤立時。

島嶼是一個具有指向它的引用變量的對象,但該對象沒有指向它的引用變量。

class A { int i = 5; } 
class B { A a = new A(); } 
class C { 
    B b; 
    public static void main(String args[]) { 
     C c = new C(); 
     c.b = new B(); 
     // instance of A, B, and C created 
     c.b = null; 
     // instance of B and A eligible to be garbage collected. 
    } 

編輯:只是想指出的是,儘管A的實例有一個參考,它是在一個小島上,因爲現在B的實例沒有對它的引用。 A實例有資格進行垃圾回收。

+1

非常好的例子,但變量命名有點混亂。 – Kiril 2014-11-15 11:34:08

5

當沒有對它的引用時,一個對象是不可取的,或者這些引用本身來自不可重複的對象。

Integer i = new Integer(4); 
// the new Integer object is reachable via the reference in 'i' 
i = null; 
// the Integer object is no longer reachable. 
0

無法訪問的對象是一個沒有「可達」引用的對象。 換句話說,沒有對它的引用。

4

當對象圖沒有鏈接到對象圖時,則引用變得無法訪問。然後垃圾收集器會掃描這些懸空的孤立對象,然後刷新恢復分配的內存。

java.lang.ref。{Phantom,Soft,Weak}引用排除不可訪問的對象。 如果終結器運行,GC已經知道它無法訪問。

讀到finalization- http://java.sun.com/developer/technicalArticles/javase/finalization/

在僅具有強引用一種語言,堆中的對象可以是從 程序到達或不可訪問。可達對象集由程序 中指向堆對象的類變量和方法變量組確定。這個集合通常被稱爲程序的根集。程序根集中變量 指向的對象是可到達的。另外,一個對象可能是間接可達的。也就是說,如果有另一個可達的對象指向它,則可以訪問一個對象 。從程序 的根集合到堆對象的這種引用鏈被稱爲可達性路徑。一個對象可能有多條可達性路徑,並且根本沒有可達性路徑。如果對象沒有可達性路徑,則它被認爲是垃圾,並且可以立即由垃圾收集器收集到 。

當沒有更強的引用存在時,對象將進入不可訪問狀態。當一個對象無法訪問時,它就是收集的候選對象。注意措辭:僅僅因爲對象是收集的候選人並不意味着它會立即收集。 JVM可以自由延遲收集,直到對象立即需要消耗內存爲止。 重要的是要指出,不只是任何強大的引用將保存在內存中的對象。這些必須是從垃圾收集根鏈中鏈接的引用。GC根是一類特殊的變量,包括堆棧 靜態變量(任何類)從JNI本機代碼

更多,如果你喜歡http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html

特別引用(任何線程)上

臨時變量

+0

「當沒有更強的引用存在時,對象進入不可訪問狀態」:這是不正確的。一個對象可以有強烈的引用,但不能從根集訪問,因此將被垃圾收集。例如,A引用B,B引用A,但都不能從根集合中到達。 – namanhams 2017-04-12 10:14:11

相關問題