Java垃圾收集器如何在这里工作?

时间:2014-10-06 18:10:36

标签: java garbage-collection

在此query remove()方法中有以下实现。

 /**
   *  remove() removes "node" from this DList.  If "node" is null, do nothing.
   *  Performance:  runs in O(1) time.
   */
  public void remove(DListNode node) {
    if((node != null) && (node.listp == this)){
        node.prev.next = node.next;
        node.next.prev = node.prev;
    }
    this.size--;
  }

执行此remove()方法后,除非DList类的用户仍然使用某个引用变量指向此节点,否则不会有任何指向object的向内指针。

我的问题:

在没有任何引用指针指向此对象之后,垃圾收集器何时以及如何删除此对象?因为GC如何在不参考的情况下控制该对象?

3 个答案:

答案 0 :(得分:2)

当且仅当可以从GC根目录(通过强引用)到达对象时,才能强烈访问该对象。也就是说,GC回收一个对象 - no longer strongly reachable - 仅仅是无法访问所述对象的结果。

现在,Java保证的一件事是if and when it chooses to do so(可能涉及什么都不做)在抛出OOM之前释放内存。

尽管代码中没有强引用并不意味着JVM没有跟踪对象或它已经消失了!该对象仍然存在 - 即使它是可以从用户代码强烈访问(读取:不可访问) - 直到/何时实际上是GC。

这允许一些有趣的案例,例如

答案 1 :(得分:1)

未定义。它可能在下一次垃圾收集器运行时发生(它只能在垃圾收集器运行时才开心),但这不是保证 - 并非所有垃圾都必须用每个gc运行清理

答案 2 :(得分:0)

Java的GC不会在它不再使用时立即丢弃。相反,GC会不时运行,检查对象'使用和清空记忆。

您不能告诉GC任意运行,但您可以通过调用System.gc()来请求它运行。但是,调用gc()不会在此时运行GC ...它只会请求系统运行它。