最終ブロックでインスタンスをオーファンとして作成すると、GC がガベージ コレクションを優先的に実行するように要求されますか?
いいえ。代入null
は、オブジェクトがガベージ コレクションされる「優先度」を変更しません。実際、これらの変数のスコープがもうすぐ終了すると仮定すると、変数への代入null
は無意味になります。
( null
Java の一部の変数またはフィールドに代入しても、参照カウントなどは減少せず、対応するオブジェクトの再利用もトリガーされません。実際、完全な GC は代入イベントを無視します。代入でできることのほとんどは、しかし、この例では、変数がスコープ外に出ようとしているところですが、いずれにせよ、これはほとんどすぐに起こります。したがって、null
代入は何も達成しません。)
ガベージ コレクションは、ユーザーの操作に関係なく、適切なタイミングであると JVM が判断したときに実行されます。呼び出しは別として...これは他の理由からSystem.gc()
本当に悪い考えです!
通常の状況では、GC がいつ実行されるかを気にする必要はありません。ただし、この場合、外部リソースを扱っています。つまり、データベース接続、結果セットなどです。これらは適切に「管理」する必要があります。そうしないと、リソースリークの問題が発生する可能性があります。
オブジェクトがGCされた場合、それらはおそらくそれぞれのfinalize
メソッドによって閉じられます。ただし、リソース リークの悪影響を回避するには、ファイナライズが遅すぎる可能性があります。
したがって、これらを管理する正しい方法はnull
、より早く GC されることを (無駄に) 希望することではありません。それらに対処する正しい方法は、ブロック内でそれぞれclose()
のメソッドを明示的に呼び出すことです。finally
例えば
finally {
conn.close(); // This should also close any child Statement and
// ResultSet instances
}
これを行うためのより良い方法は、Jon Skeet's answer で説明されているように、Java 7 の「try with resource」構文を使用することです。