我在 java 中创建了一个自定义类,用于自定义加载 Groovy 类。
我的 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
只加载了一次,只有一个实例,但是有几个实例GroovyClassLoader$InnerLoader
(在这种情况下,类加载了一次,但有几个实例)和为GroovyClassLoader
(如GroovyClassLoader$1
,GroovyClassLoader$2
等)加载的几个类
任何想法为什么尽管ClassLoader
收集了 Java,但GroovyClassLoader
它的 InnerLoader 没有被收集?
谢谢!