GCとURLClassLoaderの問題

対象サーバーOSがWindowsのときに発生。


WarとかのアプリをTomcatとかのサーバーで起動中にMXBean使用したりして
デプロイしたりアンデプロイすることがよくある。


このときに、対象リソースがURLClassLoaderで読み込まれていた場合(※通常それで読み込んでいるはず)、最終的なリソースが開放されるタイミングはGCが発生したときとなる。


しかし、デプロイ、アンデプロイする側はGCの発生を把握できずに、リソースが開放できない状態で、再デプロイしようとするとファイルが削除できないエラーだの、リソースが増えすぎて(Permanent領域のメモリを食いすぎて)OutOfMemoryエラーが発生したりして、結局、Tomcatの停止を余儀なくされる。


問題はアンデプロイのタイミングできっちりリソースを開放できればよいのだが、現在のURLClassLoader にはそういう機能はない。


また、アンデプロイのときにきっちりGCが発生するようにJVMメモリチューニングするという手もあるけども・・・実用性はないかな。


と思ったら、GarbageCollectorMXBeanできっちり回数を把握していれば行ける気がしてきた。あとは強制GCも併用するといいのかも。


※別の問題としてURLClassLoader継承の自作クラスローダーで、参照が残ったまんまでGCされないのはプログラムの変更・設計の変更が必要です。