一尘不染

在Java中将对象分配为null是否会影响垃圾回收?

java

null在Java中分配未使用的对象引用是否可以以任何可衡量的方式改善垃圾回收过程?

我在Java(和C#)方面的经验告诉我,尝试使虚拟机或JIT编译器胜过智能通常是反直观的,但是我看到同事使用此方法,我很好奇这是否是一个好的选择或其中一种巫术编程迷信?


阅读 1003

收藏
2020-03-07

共1个答案

一尘不染

通常没有。

但是像所有事物一样:这取决于。如今,Java中的GC非常好,应在无法访问所有内容后不久对其进行清理。这只是在为局部变量保留方法之后,并且不再为字段引用类实例时。

如果你知道否则将保留引用,则只需要显式设置null。例如,保留的数组。你可能想在不再需要数组的各个元素时将它们为空。

例如,来自ArrayList的以下代码:

public E remove(int index) {
    RangeCheck(index);

    modCount++;
    E oldValue = (E) elementData[index];

    int numMoved = size - index - 1;
    if (numMoved > 0)
         System.arraycopy(elementData, index+1, elementData, index,
             numMoved);
    elementData[--size] = null; // Let gc do its work

    return oldValue;
}

同样,只要没有引用保留,显式将对象清为空将不会导致它比自然超出范围自然早被收集。

都:

void foo() {
   Object o = new Object();
   /// do stuff with o
}

和:

void foo() {
   Object o = new Object();
   /// do stuff with o
   o = null;
}

在功能上是等效的。

2020-03-07