私はJava Platform Performanceを読んでいました (悲しいことに、最初にこの質問をしたときからリンクがインターネットから消えたようです)、セクション A.3.3 が心配でした。
私は、スコープから外れた変数はもはや GC ルートとは見なされないだろうという仮定に取り組んでいましたが、この論文はそれと矛盾しているようです。
最近の JVM、特に Sun の 1.6.0_07 バージョンにはまだこの制限がありますか? もしそうなら、分析するコードがたくさんあります...
この論文は 1999 年のものであるため、質問します。特に GC の世界では、状況が変わることがあります。
論文が入手できなくなったので、懸念を言い換えたいと思います。この論文は、メソッド内で定義された変数は、コード ブロックが終了するまでではなく、メソッドが終了するまで GC ルートと見なされることを暗示していました。したがって、変数を null に設定して、参照されるオブジェクトをガベージ コレクションできるようにする必要がありました。
つまり、main() メソッド (または無限ループを含む同様のメソッド) の条件付きブロックで定義されたローカル変数は、変数がスコープから外れる直前にその変数を null にしない限り、1 回限りのメモリ リークを引き起こします。
選択した回答のコードは、問題をよく示しています。このドキュメントで参照されている JVM のバージョンでは、foo オブジェクトが try ブロックの最後でスコープ外にドロップされた場合、ガベージ コレクションを実行できません。代わりに、JVM は main() メソッドが終了するまで参照を開いたままにしますが、その参照を使用することは不可能です。
これは、変数がちょうどスコープから外れようとしている場合でも、変数参照を null にすることがガベージ コレクターの助けになるという考えの起源のようです。