1. ホーム
  2. java

[解決済み] Javaでオブジェクトをnullに代入するとガベージコレクションに影響があるのか?

2023-05-05 02:50:22

質問

未使用のオブジェクト参照を null を割り当てることは、ガベージコレクション処理を改善することになるのでしょうか?

私の Java (および C#) の経験から、仮想マシンや JIT コンパイラーを出し抜こうとすることはしばしば直感に反しますが、同僚がこの方法を使うのを見て、これは良い習慣なのか、それともブードゥー教のプログラミング迷信の 1 つなのか、興味があります。

どのように解決するのですか?

一般的には、ありません。

しかし、すべてのもののように、それは依存します。最近のJavaのGCは非常に優れており、すべてがもはや到達できなくなった後、非常に短時間でクリーンアップされるはずです。これはローカル変数のためにメソッドを去った直後と、フィールドのためにクラスインスタンスがもはや参照されないときです。

そうでなければ参照され続けることが分かっている場合のみ、明示的にnullを指定する必要があります。例えば、配列のようなものです。配列の個々の要素が不要になったとき、それらを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;
}

また、明示的にオブジェクトを NULL にしても、参照が残っていない限り、自然にスコープ外に出た場合よりも早くオブジェクトが回収されることはありません。

両方です。

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

とする。

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

機能的に同等である。