垃圾收集的“隔离岛”

时间:2009-04-27 09:33:57

标签: java garbage-collection

有人可以解释垃圾收集隔离岛的概念吗?

4 个答案:

答案 0 :(得分:44)

对象A引用对象B.对象B引用对象A.对象A和对象B都不被任何其他对象引用。那是一个孤立的岛屿。

基本上,隔离岛是一组相互引用的对象,但它们不会被应用程序中的任何活动对象引用。严格地说,即使是一个未被引用的对象也是一个孤立的岛屿。

根据评论进行修改:

class A {
   B myB; 
} 
class B { 
   A myA; 
} 

/* later */  
A a = new A(); 
B b = new B();  
a.b = b; 
b.a = a;

答案 1 :(得分:10)

这是这个词的good explanation。摘录:

  
      
  • “如果对象obj1是垃圾收集,而另一个对象是obj2   包含对它的引用,然后是obj2   也有资格获得垃圾   集“
  •   
  • “如果对象obj2可以访问符合垃圾条件的对象obj1   收集,然后obj2也符合条件   垃圾收集“
  •   
     

这被称为“隔离岛”。   一个“隔离岛”描述了一个   或更多对象没有引用   他们来自一个活跃的部分   应用

答案 2 :(得分:9)

要记住的是,只有直接或间接地从 GC根对象(线程,当前局部变量,静态变量等)引用对象时才会收集对象。如果两个(或更多)对象相互引用但未从根引用,则它们可以进行垃圾回收。

答案 3 :(得分:3)

事实上,如果你理解Mark和Sweep of Garbage Collection的概念,你也会理解更好的隔离岛:

  • 算法从GC根开始:主线程,main方法中的局部变量,主类的静态变量。
  • 算法遍历所有对象引用,从GC根开始,并将每个被发现的对象标记为活着。
  • 回收未被标记对象占用的所有堆内存。它只是标记为免费,基本上没有未使用的对象。
  • 如果两个或多个对象相互引用但它们未被与任何根链接的对象引用,则它们位于隔离岛中,并且也被扫描。