1. ホーム
  2. java

[解決済み] Javaオブジェクトをnullにすることはもう意味がないのでしょうか?

2022-05-18 02:58:05

質問

古い本を見ていたら、Peter Hagger の "Practical Java" を見つけました。パフォーマンスのセクションで、オブジェクト参照を null に設定することを推奨しています。

Javaでは、オブジェクト参照を null に設定することで、パフォーマンスやガベージコレクションの効率は向上しますか?もしそうなら、どのような場合に問題になるのでしょうか?コンテナ・クラス?オブジェクトの構成?匿名の内部クラス?

私はコードでこれをかなり頻繁に見ます。これはもう時代遅れのプログラミングのアドバイスなのでしょうか、それともまだ役に立つのでしょうか?

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

あなたがいつ参照をnullにしようと思ったかに少し依存します。

オブジェクト チェーン A->B->C がある場合、いったん A に到達できなくなると、A、B、C はすべてガベージ コレクションの対象になります (B または C のいずれかを参照しているものが他にないと仮定します)。たとえば、参照 A->B または B->C を明示的に null に設定する必要はありませんし、これまでもそうでした。

それは別として、ほとんどの場合、現実にはコレクション内のオブジェクトを扱っているので、この問題は本当に発生しません。一般的には、適切な remove() メソッドを呼び出すことで、リストやマップなどからオブジェクトを削除することを常に考えているはずです。

がある場合 があった場合 において、参照を null に設定するようにというアドバイスがありました。 長いスコープで、メモリを大量に消費するオブジェクトがスコープの途中で使われなくなった場合です。 . たとえば

{
  BigObject obj = ...
  doSomethingWith(obj);
  obj = null;             <-- explicitly set to null
  doSomethingElse();
}

ここでの根拠は、なぜなら obj がまだスコープ内にあるため、 明示的に参照を NULL 化しないと、その後に doSomethingElse() メソッドが完了するまでガベージコレクタになりません。そして、これは以下のようなアドバイスです。 おそらく最近のJVMではもはや通用しない JIT コンパイラーは、与えられたローカルオブジェクトの参照がもはや使用されないどの時点であるかを見つけ出すことができることが判明しました。