今回は、最後の一杯はやはり一杯きり、というお話。
むらさんの.NETのメモリ管理 のなちゃさまのコメントが元ネタです。
Javaの場合、ガーベッジコレクション(GC)がオブジェクトを回収しようとしたときに、回収に先駆けてObject#finalize()メソッドを呼び出します。この呼び出しは、1つのインスタンスにつき1回だけです。
プログラマはfinalize()をオーバーライドして、その中でthisオブジェクトを例えばstaticフィールドに格納するなどして復活させることが可能です。これは推奨されませんが、システムはそれを阻めないので、可能となっています。
こうして復活したオブジェクトが再びGCによって回収されようとしたとき、 もはやfinalize()は呼び出されることはありません。そう、先も言った通り1度しか呼び出されることはないのです。
もし、どうしても復活させたい(という妥当な要件が思いつきませんが…)場合は該当オブジェクト自身を復活させるのではなく、新しくインスタンスを作って代替わりすることが推奨されます。
さて.NETのGCの挙動はどうなのでしょう?
投稿日時 : 2007年8月1日 17:39