假设我们遇到这样的情况:
对象A无法访问,但它有一个指向有效,可访问对象的引用。那么对象A会被垃圾收集吗?或者我们有内存泄漏的风险?
EDIT1
具体来说,我写了一个三元树,它有:
class Node {
Node left, mid, right;
int data;
...
}
我实现了delete(Node p)函数,它通过将其父引用设置为null来使p无法访问。但是,树中的另一个节点(称为m)将在删除p:
之前调用此节点m.mid = p.mid;
delete(p); // Make p unreachable
我只是想确保那个p将被垃圾收集,但我仍然保留对p.mid的引用
答案 0 :(得分:4)
对象A无法访问,但它有一个指向有效,可访问对象的引用。那么对象A会被垃圾收集吗?
是。 (最终)。无法访问的对象是垃圾收集的候选对象。
或者我们有内存泄漏的风险?
没有
当一个对象无法访问时,它所持有的任何引用都是:
现在,在您的对象A 实际垃圾收集之前,可能需要很长时间(即多次GC运行)。直到它实际上是垃圾收集,它所引用的对象的关闭也不会被收集。但是,这不是内存泄漏。如果JVM需要内存,那么可以放心 1 在JVM抛出OOME之前收集所有无法访问的对象。
1 - ...模块化某些JVM GC选项设置...