最終ブロックでインスタンスをオーファンとして作成すると、GC がガベージ コレクションを優先的に実行するように要求されますか?
いいえ。代入nullは、オブジェクトがガベージ コレクションされる「優先度」を変更しません。実際、これらの変数のスコープがもうすぐ終了すると仮定すると、変数への代入nullは無意味になります。
( nullJava の一部の変数またはフィールドに代入しても、参照カウントなどは減少せず、対応するオブジェクトの再利用もトリガーされません。実際、完全な 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」構文を使用することです。