垃圾收集的“隔离岛”

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

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

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

编辑点评:

class A { B myB; } class B { A myA; } /* later */ A a = new A(); B b = new B(); ab = b; ba = a; 

这是对这个术语的一个很好的解释 。 摘抄:

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

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

需要注意的是,只有在直接或间接从GC根对象 (线程,当前局部variables,静态variables等)引用对象时才会收集对象 。 如果两个(或多个)对象相互引用,但没有从根引用,则它们有资格进行垃圾回收。

事实上,如果你理解垃圾收集的标记和扫描的概念,你也会更好地理解隔离岛:

  • 该algorithm从GC根:主线程,主方法中的局部variables,主类的静态variables开始。
  • 该algorithm遍历所有对象引用,从GC根开始,并标记每个find的对象。
  • 没有被标记的对象占用的所有堆内存都被回收。 它被简单地标记为空闲的,基本上没有未使用的对象。
  • 如果两个或两个以上的对象相互引用,但它们没有被与任何根连接的对象引用,则它们位于隔离岛,并且也被扫描。