GCとURLClassLoaderの問題
対象サーバーOSがWindowsのときに発生。
WarとかのアプリをTomcatとかのサーバーで起動中にMXBean使用したりして
デプロイしたりアンデプロイすることがよくある。
このときに、対象リソースがURLClassLoaderで読み込まれていた場合(※通常それで読み込んでいるはず)、最終的なリソースが開放されるタイミングはGCが発生したときとなる。
しかし、デプロイ、アンデプロイする側はGCの発生を把握できずに、リソースが開放できない状態で、再デプロイしようとするとファイルが削除できないエラーだの、リソースが増えすぎて(Permanent領域のメモリを食いすぎて)OutOfMemoryエラーが発生したりして、結局、Tomcatの停止を余儀なくされる。
問題はアンデプロイのタイミングできっちりリソースを開放できればよいのだが、現在のURLClassLoader にはそういう機能はない。
また、アンデプロイのときにきっちりGCが発生するようにJVMメモリチューニングするという手もあるけども・・・実用性はないかな。
と思ったら、GarbageCollectorMXBeanできっちり回数を把握していれば行ける気がしてきた。あとは強制GCも併用するといいのかも。
※別の問題としてURLClassLoader継承の自作クラスローダーで、参照が残ったまんまでGCされないのはプログラムの変更・設計の変更が必要です。