只要内存中没有足够的空间,Java就会运行它的垃圾收集器。它通过删除未引用的对象来实现。那么,如果一个对象有一个指向自身的指针,或者总是有一个指向它的指针的任何循环指向结构呢?垃圾收集器是否会失败,还是会识别出我们为了使其失败而进行的任何此类阴险尝试?
答案 0 :(得分:2)
Java垃圾收集器不会回收由静态或局部变量指向的对象的任何内存,也不会回收从这些对象链接(递归)的任何对象的内存。因此,如果您有大型链接的对象树,如果存在指向树或循环的任何根的变量,则垃圾收集器将不会回收该空间。
只要没有指向循环中对象的静态或局部变量,就会回收循环中链接的对象的内存。因此,如果您希望垃圾收集有效工作,请确保在不再需要对象时将变量置空。
垃圾收集器确实检测到并且不关心对象是否以循环方式链接。对于是否可以从变量到达对象,唯一重要的是。
答案 1 :(得分:2)
“引用对象B和B引用A”称为隔离岛。 GC非常聪明,可以检测到这些事情。如果岛上没有任何物体参考,整个岛屿都有资格进行垃圾收集
答案 2 :(得分:2)
是否收集对象取决于垃圾收集算法
垃圾收集器将收集无法从引用的根集访问的对象(当前局部变量,静态引用,堆栈帧的操作数堆栈)。这意味着即使是其他对象引用的对象仍然可以被收集。
因此,您的循环指针结构将被收集,即使每个对象都被引用,如果没有其他参考路径从根集传递到形成循环的对象。