Groovyクラスをカスタムロードするために使用しているJavaでカスタムクラスを作成しました。
私のJavaクラスは次のように始まります。
public class ClassLoader {
private GroovyClassLoader groovyClassLoader = new GroovyClassLoader();
次に、を使用しgroovyClassLoader
てクラスを名前でロードするメソッドがあります。
Class c = groovyClassLoader.loadClass(className, true, false, true);
これはすべて正常に機能しており、問題はありません。ただし、Groovyクラスをすべて動的にリロードしたい場合があるため、現時点では、Javaコードは基本的にインスタンスを再インスタンス化しClassLoader
ます。これにより、インスタンスへの参照が残りなくなりClassLoader
、予想どおりにGCされます。
ただし、ロードされたクラスを(VisualVMとMATを使用して)数回リロードした後に調べると、JavaクラスClassLoader
が1回だけロードされ、インスタンスが1つだけであることがわかりますが、いくつかのインスタンスがありますGroovyClassLoader$InnerLoader
(この場合、クラスは1回ロードされますが、いくつかあります)インスタンス)およびロードされたいくつかのクラスGroovyClassLoader
(GroovyClassLoader$1
、GroovyClassLoader$2
など)
ClassLoader
Javaが収集されているにもかかわらず、GroovyClassLoader
とそのInnerLoaderが収集されていない理由はありますか?
ありがとう!