【问题标题】:How does Java garbage collector work here?Java 垃圾收集器在这里是如何工作的?
【发布时间】:2014-12-01 01:32:06
【问题描述】:

在这个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 类的用户仍然使用某个引用变量指向该节点。

我的问题:

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

【问题讨论】:

  • 您真的想知道 何时 它发生或只是 如何 它可以在不保留对节点的引用的情况下工作?您的问题标题表示前者,您的文本表示后者。
  • @random6174 它是怎么发生的?什么时候?在 C++ 中,当您编写此类 DList 类时,我们还会自行跟踪 memtrack 功能,以在分配更多节点之前检查内存的健康状况。
  • Java 根本没有要求拥有垃圾收集器,不同的实现以不同的方式做到这一点。您保证的只是一个对象在您删除所有强引用之前不会被释放。
  • 可能没有对可用于用户代码的对象的引用,但 JVM 仍会跟踪每个对象。事实上在这一点上,谈论“引用”是错误的,因为有几种类型的引用:强引用、软引用、弱引用和幻像,它们都会影响对象与 GC 交互的方式。
  • 据我所知,Java GC 保留自己对所有对象的引用,并使用 Mark-And-Sweep 算法删除用户不再(直接或间接)引用的对象。时间未定。

标签: java garbage-collection


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    Java 的 GC 不会在对象不再使用时立即将其丢弃。相反,GC 会不时运行,检查对象的使用情况并清空内存。

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

    【讨论】:

      【解决方案3】:

      一个对象可能no longer strongly reachable之后的任何点被GC/回收。当且仅当可以从 GC 根(通过强引用)到达对象时,它才是强可达的。也就是说,GC 回收一个对象 - if and when it chooses to do so - 仅仅是无法访问该对象的结果。

      现在,Java 保证的一件事是 it will try it's best(可能什么都不做)在引发 OOM 之前释放内存。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-24
        • 1970-01-01
        • 2014-02-05
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多