垃圾收集——在Java中,什么时候一个对象变得不可访问



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

谁能举个例子给点主意?

当不再有任何引用变量指向它时,或者当它在孤岛上成为孤儿时。

孤岛是一个对象,它有一个引用变量指向它,但是这个对象没有引用变量指向它。

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实例符合垃圾收集条件。

当一个对象不再被引用时,或者这些引用本身来自不可访问的对象时,该对象是不可访问的。

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已经知道它不可访问。

阅读final - http://java.sun.com/developer/technicalArticles/javase/finalization/

在只有强引用的语言中,堆对象可以是可访问的,也可以是不可访问的程序。可访问对象的集合由程序中的类变量和方法变量的集合决定指向堆对象。这个集合通常被称为程序的根集。由变量指向的对象在程序的根集中是可到达的。此外,对象可能是间接可及的。也就是说,对象是如果有另一个可达对象指向它。这样的引用链来自程序的根集到堆对象的路径称为可达性路径。一个对象可以有多个可达路径,也可以有多个可达路径根本没有可达路径。如果对象没有可达路径,则认为它是垃圾,可以立即处理由垃圾回收器收集。

当不再存在对对象的强引用时,对象进入不可达状态。当一个对象不可访问时,它是收集的候选对象。注意措辞:仅仅因为对象是收集的候选对象并不意味着它将立即被收集。JVM可以自由地延迟收集,直到对象需要立即使用内存。重要的是要注意,并不是所有的强引用都会在内存中保存对象。这些必须是来自垃圾收集根的链接引用。GC根是一类特殊的变量,它包含

堆栈上的临时变量(任何线程)静态变量(来自任何类)来自JNI本地代码的特殊引用

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

不可达对象是指没有"可达"引用的对象。换句话说,没有引用它

最新更新