1

可能的重复:
Java 中的垃圾收集和循环引用

每当内存空间不足时,Java 就会运行它的垃圾收集器。它通过删除未引用的对象来实现。那么如果一个对象有一个指向它自己的指针,或者任何一个总是有一个指向它的指针的循环指向结构呢?垃圾收集器会失败还是会识别出我们为使其失败而做出的任何此类阴险尝试?

4

3 回答 3

2

Java 垃圾收集器不会回收静态或局部变量指向的对象的任何内存,或者从这些对象链接(递归)的任何对象。因此,如果您有大型链接的对象树,如果有一个变量指向树或循环的任何根,垃圾收集器将不会回收该空间。

只要没有静态或局部变量指向循环中的对象,循环中链接的对象的内存就会被回收。因此,如果您希望垃圾收集有效地工作,请确保在不再需要对象时清空变量。

垃圾收集器确实检测并且不关心对象是否以循环方式链接。唯一重要的是是否可以从变量中访问对象。

于 2013-01-12T03:09:26.550 回答
2

“A 引用对象 B 和 B 引用 A”称为隔离岛。GC 足够聪明,可以检测到这样的事情。如果没有对岛中任何对象的引用,则整个岛都有资格进行垃圾收集

于 2013-01-12T03:21:47.790 回答
2

对象是否被收集取决于垃圾收集算法

  • 引用计数GC,不会收集循环引用
  • 但是,现代 GC 算法通常通过从根集开始遍历堆来确定对象的收集资格。

垃圾收集器将收集无法从根引用集访问的对象(当前局部变量、静态引用、堆栈帧的操作数堆栈)。这意味着即使是被其他一些对象引用的对象仍然可以被收集。

因此,即使引用了每个对象,如果没有其他引用路径从根集传递到形成循环的对象,您的循环指针结构也会被收集。

另请参阅什么触发了 Java 垃圾收集器

于 2013-01-12T03:37:18.260 回答