繁体   English   中英

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

[英]How does Java garbage collector work here?

在此查询中, 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类的用户仍使用某些引用变量指向此节点。

我的问题:

没有引用指针指向该对象后,垃圾收集器何时以及如何将其垃圾处理? 因为GC如何在没有任何引用的情况下控制该对象?

不再强烈可达对象之后的任何时候,都可以对其进行GC /回收。 当且仅当可以从GC根目录(通过强引用)访问该对象时,该对象才是高度可访问的。 也就是说,GC回收对象( 如果选择回收的对象)仅是无法访问该对象的结果。

现在,Java保证的一件事是, 它将在抛出OOM之前尽其最大努力 (可能不采取任何措施)释放内存。

即使代码中没有强大的引用,也并不意味着JVM不会跟踪对象或对象消失了! 该对象仍然存在 -尽管它不是强可到达(读:不可访问)从用户代码-直到/当这种实际GC'ed。

例如,这允许一些有趣的情况。

未定义。 下次垃圾收集器运行时可能会发生这种情况(只有当垃圾收集器运行时它才会高兴),但这不能保证-并非每次gc运行都必须清除所有垃圾

Java的GC一旦不再使用它就不会丢弃对象。 相反,GC会不时运行,检查对象的使用情况并清空内存。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM