如何将值设置为null让我们避免游荡并启用垃圾收集?

时间:2016-05-22 07:20:58

标签: java garbage-collection

我正在查看一个方法(delMin())来删除堆中的小元素。它将变量min设置为等于最小值,然后将min的值设置为null为"避免游荡并帮助进行垃圾收集。"有人可以解释JVM如何处理这个以及为什么这是一个好主意?

public Key delMin() {
    if (isEmpty()) throw new NoSuchElementException("Priority queue underflow");
    exch(1, N);
    Key min = pq[N--];
    sink(1);
    pq[N+1] = null;         // avoid loitering and help with garbage collection
    if ((N > 0) && (N == (pq.length - 1) / 4)) resize(pq.length  / 2);
    assert isMinHeap();
    return min;
}

3 个答案:

答案 0 :(得分:1)

  

然后将min的值设置为null

不,不。它将数组的最终使用元素设置为null,以便该数组不再包含对该对象的引用。

当对象不再有强引用时,只能对其进行垃圾回收。您不希望堆保留对不再是逻辑上属于堆的对象的引用,因为这可能最终成为对象的最后一个强引用。

通常,从集合中删除元素时,您需要确保不再引用集合中的对象 - 这只是该规则的一个特定示例。

答案 1 :(得分:0)

一旦没有对该对象的引用,分配给对象的空间将由垃圾收集器回收。在您提供的代码中,如果没有对基础对象的引用,则设置min仅有助于垃圾收集

答案 2 :(得分:0)

撰写该评论的人正在"可爱"。赋值的真正目的是避免(Java)内存泄漏。

GC没有意识到pq以外的pq[N]中的引用是"死了&#34 ;;即它们不会被优先级队列实现再次使用。如果代码没有将null分配给该插槽,那么这些死引用可能会阻止GC收集相应的对象。

  

有人可以解释一下JVM如何解决这个问题......

JVM实际上并没有处理这个问题。代码正在处理"。

  

......为什么这是一个好主意?

因为它避免了内存泄漏,(在最坏的情况下)可能导致使用此代码的应用程序填满堆并崩溃。