垃圾回收的“孤岛”问题

55

请问有人可以解释一下垃圾回收的孤岛概念吗?

4个回答

57

对象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;

这篇文章可能有点老了,但我的问题可能有点幼稚。当你说对象A引用对象B,对象B引用对象A时,你是指像这样的情况吗?A a = B; B b = a? - user962206
5
@user962206的意思是:class A { B myB; } class B { A myA; } /* later */ A a = new A(); B b = new B(); a.b = b; b.a = a; 如果您能理解这个...但说实话,只需要这样就足够了:class A { B myB; } class B { } B b = new B(); A a = new A(); a.b = b; - corsiKa
2
代码应该是这样的: A a = new A(); B b = new B(); a.myB = b; b.myA = a;如果我错了,请纠正我。 - Akshay
但是孤立的对象会发生什么呢?它们最终会被移除吗? - Java bee

11

以下是一个好的解释这个术语。摘录:

  • “如果一个对象obj1被垃圾回收,但另一个对象obj2包含对它的引用,则obj2也有资格进行垃圾回收”
  • “如果对象obj2可以访问有资格进行垃圾回收的对象obj1,则obj2也有资格进行垃圾回收”

这被称为“孤立岛”。 “孤立岛”描述了一个或多个对象在应用程序的活动部分中没有对它们的引用。


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

4

事实上,如果你了解垃圾收集中的标记和清除(Mark and Sweep)的概念,你将更好地理解孤岛对象(Island of Isolation):

  • 算法从GC Roots开始:主线程、主方法中的局部变量、主类的静态变量。
  • 算法遍历所有对象引用,从GC Roots开始,并将找到的每个对象标记为活动状态。
  • 所有未被标记为活动的堆内存都会被回收。它只是被标记为空闲,本质上是被清空了未使用的对象。
  • 如果两个或两个以上的对象彼此引用,但它们没有被任何根对象链接引用,则它们处于孤岛对象,也会被清理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接