class garbage collection

 nekopさんに教えてもらったキーワード “class garbage collection” で説明を発見しました。(多謝>nekop)

 Java Forums – Static class garbage collection にそのまま書いてあります。某書籍に書いてあった例は片手落ちで、普通のシステムクラスローダを使ってCLASSPATHからロードされたstaticフィールドを持つクラスについては、Javaアプリケーションが終了するまで勝手にアンロードされることはないとのことです。これは、システムクラスローダがそのクラスへの参照を保持し続けるからです。

 独自のクラスローダを使うアプリケーションでは、気にする必要があります。TomcatなどのServlet/JSPコンテナではWebアプリケーションのロードをリロードを独自に行う必要があるので独自のクラスローダを使っています。

 実際のものは調べていませんが、もしTomcatが用意しているクラスローダが動的なクラスローダで、必要なときしかTomcatがこのインスタンスを生成しないとすると、クラスローダがガーベッジコレクトに回収される場面がでてきます。すると、そのクラスローダからロードされて、クラスローダからしか参照されていなかった「staticフィールドを持つクラス」は、参照していたクラスローダがいなくなるため、どのクラスからも参照されなくなってしまいます。このため、回収される可能性があるわけです。つまり、WebアプリケーションでSingletonクラスを使おうとすると、Servlet/JSPコンテナが用意しているクラスローダの実装によっては、問題が発生する可能性があるわけです。この危険性を避けるためには、Webアプリケーションの主となるServletクラスからSingletonクラスのインスタンスをstatic参照するようにしておけば、参照オブジェクトのルートセットから辿れるようになるので、ガーベッジコレクトへ回収されることはありません。

 本当はこの動作確認を簡単に行える方法があるといいのですが、JavaVMのモニタリングが必要そうなので、ちょっと難しそうです。

(簡単な解説を書いてみたけど、間違えていたら指摘してもらえると助かります)

class garbage collection」への1件のフィードバック

  1. ピンバック: hiro345

コメントは停止中です。

同じカテゴリの記事: etc