在java中,什么时候一个对象变得不可达?

在java中,什么是不可达对象? 什么时候该对象变得无法访问? 在学习垃圾收集的时候,我无法理解这个概念。

任何人都可以提供任何想法的例子?

当不再有任何引用variables的时候,或者当它在一个孤岛中孤立的时候。

岛是一个具有指向它的引用variables的对象,但是该对象没有指向它的引用variables。

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(); cb = new B(); // instance of A, B, and C created cb = null; // instance of B and A eligible to be garbage collected. } 

编辑:只是想指出,即使A的实例有一个参考,它现在在岛上,因为B的实例没有对它的引用。 A实例有资格进行垃圾回收。

当没有更多的引用时,一个对象是不可取的,或者这些引用本身是不可重复的对象。

 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. 

在没有链接到对象图的对象图中,则引用变得无法访问。 然后垃圾收集器扫描这些悬空的孤立对象,并刷出恢复分配的内存。

java.lang.ref。{Phantom,Soft,Weak}引用将无法访问的对象排入队列。 如果终结器运行,GC已经知道它无法访问。

阅读关于定稿 – http://java.sun.com/developer/technicalArticles/javase/finalization/

在只有强引用的语言中,堆对象可以从程序中访问或不可访问。 可达对象的集合由程序中指向堆对象的一组类variables和方法variables确定。 这个集合通常被称为程序的根集。 程序的根集中的variables所指向的对象是可到达的。 另外,一个对象可能是间接可达的。 也就是说,如果有另一个可达的对象指向它,则可以访问一个对象。 从程序根集到堆对象的引用链被称为可达path。 一个对象可能有多个可达性path,并且根本没有可达性path。 如果对象没有可达性path,则认为是垃圾,可以立即被垃圾收集器收集。

当没有更强的引用存在时,对象进入不可达状态。 当一个对象无法访问时,它是一个收集的候选对象。 注意措辞:只是因为一个对象是收集的候选人并不意味着它会立即收集。 JVM可以自由延迟收集,直到需要对象消耗内存。 重要的是要指出,不只是任何强大的参考将在内存中保存一个对象。 这些必须是从垃圾收集根链中链接的引用。 GC根源是一个特殊的variables类别

(任何线程)的临时variables静态variables(来自任何类)JNI本地代码的特殊参考

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

无法访问的对象是没有“可达”引用的对象。 换句话说,没有引用它。