我正在查看一个方法(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;
}
答案 0 :(得分:1)
然后将
min
的值设置为null
不,不。它将数组的最终使用元素设置为null
,以便该数组不再包含对该对象的引用。
当对象不再有强引用时,只能对其进行垃圾回收。您不希望堆保留对不再是逻辑上属于堆的对象的引用,因为这可能最终成为对象的最后一个强引用。
通常,从集合中删除元素时,您需要确保不再引用集合中的对象 - 这只是该规则的一个特定示例。
答案 1 :(得分:0)
一旦没有对该对象的引用,分配给对象的空间将由垃圾收集器回收。在您提供的代码中,如果没有对基础对象的引用,则设置min仅有助于垃圾收集
答案 2 :(得分:0)
撰写该评论的人正在"可爱"。赋值的真正目的是避免(Java)内存泄漏。
GC没有意识到pq
以外的pq[N]
中的引用是"死了&#34 ;;即它们不会被优先级队列实现再次使用。如果代码没有将null
分配给该插槽,那么这些死引用可能会阻止GC收集相应的对象。
有人可以解释一下JVM如何解决这个问题......
JVM实际上并没有处理这个问题。代码正在处理"。
......为什么这是一个好主意?
因为它避免了内存泄漏,(在最坏的情况下)可能导致使用此代码的应用程序填满堆并崩溃。