Java:指向可达对象的无法访问的对象是否会被垃圾回收?

时间:2014-07-13 07:00:12

标签: java object memory-leaks reference garbage-collection

假设我们遇到这样的情况:

对象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的引用

1 个答案:

答案 0 :(得分:4)

  

对象A无法访问,但它有一个指向有效,可访问对象的引用。那么对象A会被垃圾收集吗?

是。 (最终)。无法访问的对象是垃圾收集的候选对象。

  

或者我们有内存泄漏的风险?

没有

当一个对象无法访问时,它所持有的任何引用都是:

  • 与计算无关,
  • 与其自身的可达性无关,
  • 与这些引用引用的对象的可访问性无关。

现在,在您的对象A 实际垃圾收集之前,可能需要很长时间(即多次GC运行)。直到它实际上是垃圾收集,它所引用的对象的关闭也不会被收集。但是,这不是内存泄漏。如果JVM需要内存,那么可以放心 1 在JVM抛出OOME之前收集所有无法访问的对象。


1 - ...模块化某些JVM GC选项设置...