通过制作循环链表来防止java垃圾回收?

时间:2013-01-12 02:59:29

标签: java garbage-collection

  

可能重复:
  Garbage Collection in Java and Circular References

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

“引用对象B和B引用A”称为隔离岛。 GC非常聪明,可以检测到这些事情。如果岛上没有任何物体参考,整个岛屿都有资格进行垃圾收集

答案 2 :(得分:2)

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

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

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

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

另见What triggers the Java Garbage Collector