2011/05/30

Java SE 7で追加されたURLClassLoader.close()について

Java SE 7で、java.net.URLClassLoaderクラスにcloseメソッドが追加されました。

closeメソッドが追加された背景については、「Closing a URLClassLoader」 に説明があります。

説明を解釈すると、次のようになります。
JavaアプリケーションがクラスおよびURLClassLoaderオブジェクトへの参照がなくなった後に、ガーベジコレクションおよびファイナライゼーションにより、URLClassLoaderオブジェクトが掴んでいたjarファイルがクローズされます。jarファイルがクローズされた後に、jarファイルを置き換えて再度URLClassLoaderオブジェクトを生成すれば、最新のクラスをロードし直せるようになります。

ところが、jarファイルがクローズされるタイミングというのは、ガーベジコレクションとファイナライゼーションの実行タイミングに依存する、つまり予測できないわけです。特にWindowsではクローズされていないファイルを削除することができないため、jarファイルを置き換えるタイミングが難しいという問題があります。(Linuxでも同じ気がするが…)

そこでJava SE 7では、URLClassLoaderにcloseメソッドを追加し、明示的にjarファイルをクローズできるようにした…
ということのようです。

ここで注意したいのは、APIリファレンスに説明があるのですが、URLClassLoaderオブジェクトが一度ロードしたクラスはcloseメソッドを呼んでも継続して当該クラスを取得可能ですが、まだロードされていないクラスはcloseメソッドを呼ぶとロードされなくなるという点です。

うーん、今まで問題なく動作していたJavaアプリケーションにcloseメソッドを呼ぶ処理を追加したら、ClassNotFoundExceptionがスローされる可能性が出てくるわけですよね?
URLClassLoader.close()の使いどころが、工夫次第でなかなか難しい気がするのですがが、皆さんはどう考えるでしょうか?

0 件のコメント:

コメントを投稿