凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 46731
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

今回は、最後の一杯はやはり一杯きり、というお話。

むらさんの.NETのメモリ管理 のなちゃさまのコメントが元ネタです。

Javaの場合、ガーベッジコレクション(GC)がオブジェクトを回収しようとしたときに、回収に先駆けてObject#finalize()メソッドを呼び出します。この呼び出しは、1つのインスタンスにつき1回だけです。

プログラマはfinalize()をオーバーライドして、その中でthisオブジェクトを例えばstaticフィールドに格納するなどして復活させることが可能です。これは推奨されませんが、システムはそれを阻めないので、可能となっています。

こうして復活したオブジェクトが再びGCによって回収されようとしたとき、 もはやfinalize()は呼び出されることはありません。そう、先も言った通り1度しか呼び出されることはないのです。

もし、どうしても復活させたい(という妥当な要件が思いつきませんが…)場合は該当オブジェクト自身を復活させるのではなく、新しくインスタンスを作って代替わりすることが推奨されます。

さて.NETのGCの挙動はどうなのでしょう?

投稿日時 : 2007年8月1日 17:39
コメント
  • # re: ファイナライズ in Java
    かつのり
    Posted @ 2007/08/02 0:14
    Sunの実装ではjava.lang.ref.FinalReferenceを継承したjava.lang.ref.Finalizerがこの辺の仕事をするわけですが、
    この辺はVMの領域なので、なかなか手が出せない領域です。

    これをハックできると面白いのですが、なんせVM依存なので、余計に手が出しにくい。
  • # finalizeのオーバーライドの注意
    かつのりの日記2
    Posted @ 2007/08/02 0:34
    finalizeのオーバーライドの注意
  • # re: ファイナライズ in Java
    凪瀬
    Posted @ 2007/08/02 1:26
    FinalReference?
    少なくともjavadocにはそのようなクラスの記述はありませんが…
    sunの実装の方のクラスでしょうか?
  • # re: ファイナライズ in Java
    かつのり
    Posted @ 2007/08/02 10:09
    FinalReferenceはパッケージプライベートクラスです。
    なのでJavadoc対象外になっていますね。
    Sun専用なのかな・・・
  • # re: ファイナライズ in Java
    むら
    Posted @ 2007/08/02 12:50
    .NETではGC.ReRegisterForFinalizeメソッドがあるので、Finalizeは何度も呼び出しが可能です。
    しかしながら、おっしゃる通りFinalizeメソッドからの復活は推奨されない様です。

    今回の件でReRegisterForFinalizeメソッドの存在意義について悩んでいましたが...GC.SuppressFinalizeと言うメソッドがあり、そのメソッドでFinalizeの起動を抑制することが出来るので、そのSuppressの取り消しのために必要なのだと理解しました。
タイトル
名前
Url
コメント