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など)
ClassLoaderJavaが収集されているにもかかわらず、GroovyClassLoaderとそのInnerLoaderが収集されていない理由はありますか?
ありがとう!