カスタムクラスローダーを使用してGroovyクラスを動的にリロードするJavaクラスがあり、一部のクラスが収集されないという奇妙な動作が見られますが、時間の経過とともにメモリがリークすることはありません(たとえば、perm genは無期限に成長し続けません)。
私のJavaコードでは、そのようなクラスをロードしています(簡単にするためにボイラープレートのものは削除されています):
Class clazz = groovyClassLoader.loadClass(className, true, false, true);
instance = clazz.newInstance();
次に、クラスローダーキャッシュ、メタレジストリなどをクリアして、Groovyクラスを動的にリロードします。
for (Class c : groovyClassLoader.getLoadedClasses()){
GroovySystem.getMetaClassRegistry().removeMetaClass(c);
}
groovyClassLoader.clearCache();
さて、このコードをループして、groovyクラスを絶えずロードしてから再ロードすると、奇妙な動作が見られます(私のテストコードは、文字通りリロードプロセスをループしているだけです-作成されたオブジェクトなどでは何もしません、したがって、上記のコードのインスタンスはローカルであるため、GCに適しているはずです)。
maxpermsizeを128mに設定して実行すると、リーク動作が発生し、OOMpermgenエラーが発生します。
ただし、もう一度実行してmaxpermsizeを256mに増やすと、すべてが良好で、永久に実行できます(このイメージは1時間ですが、何千ものリロードを実行して一晩実行しました):
誰かが同様の行動に出くわしたことがありますか?または何かアイデアがありますか?また、最初の例では、メモリ使用量が着実に増加するのではなく、段階的に増加するのも奇妙に思えます。