在java中什么时候对象变得无法访问?

时间:2011-04-14 18:17:29

标签: garbage-collection

在java中,什么是无法访问的对象?对象何时无法访问?在研究垃圾收集时,我无法理解这个概念。

任何人都可以通过示例提出任何想法吗?

4 个答案:

答案 0 :(得分:21)

当没有任何引用变量引用它时,或者当它在孤岛中孤立时。

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

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 :(得分:4)

当没有更多对它的引用时,该对象是不可达的,或者这些引用本身来自无法访问的对象。

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. 

答案 2 :(得分:4)

如果没有链接到对象图中的

,则引用变得无法访问。然后垃圾收集器扫描这些悬空的孤儿对象并刷掉重新获得分配的内存。

java.lang.ref。{Phantom,Soft,Weak}参考将无法到达的对象排队。  如果运行终结器,则GC已知道其无法访问。

了解最终确定 - http://java.sun.com/developer/technicalArticles/javase/finalization/

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

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

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

如果您愿意http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html

,请执行以下操作

答案 3 :(得分:0)

无法访问的对象,是一个没有"可到达的对象"参考它。 换句话说,没有引用它。