【问题标题】:Java: Will an unreachable object which points to reachable object be garbage collected?Java:指向可访问对象的不可访问对象会被垃圾收集吗?
【发布时间】:2014-07-13 07:00:11
【问题描述】:

假设我们有这样的情况:

对象 A 无法访问,但它有一个指向有效的、可访问对象的引用。那么对象 A 会被垃圾回收吗?或者我们有内存泄漏的风险?

EDIT1

具体来说,我写了一个类三叉树,它有:

class Node {
   Node left, mid, right;
   int data;

...
}

我实现了 delete(Node p) 函数,它通过将 p 的父引用设置为 null 来使 p 无法访问。但是,树中的另一个节点(称为 m)会在删除 p 之前调用这个节点:

m.mid = p.mid;  
delete(p);    // Make p unreachable

我只是想确保 p 将被垃圾回收,但 m 仍然保留对 p.mid 的引用

【问题讨论】:

  • 如果对象不可访问,它可以被垃圾回收。句号。
  • 你为什么会认为这里有内存泄漏?收集无法访问的对象是 GC 的工作。

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


【解决方案1】:

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

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

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

没有。

当一个对象不可达时,它持有的任何引用都是:

  • 与计算无关,
  • 与其自身的可达性无关,并且
  • 与那些引用所引用的对象的可达性无关。

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


1 - ... 以某些 JVM GC 选项设置为模 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多