我正在调查一些 JVM bsaed 代码中的内存泄漏(在 Java 环境中运行的 groovy)。
我有一个简单的 Java 测试类,我用它来调查 Groovy 类加载的各种行为,并且我正在运行以下代码(来自纯 Java):
GroovyClassLoader localGroovyClassLoader = new GroovyClassLoader();
Class clazz = localGroovyClassLoader.loadClass("com.test.Example", true, false, true);
WhereExample
只是一个简单的 Groovy 类(没有做任何特别的事情,因为它只是我的虚拟案例)。
现在,如果在上述代码之后立即记录以下内容:
localGroovyClassLoader.getLoadedClasses().length
它记录一个 0 - 尽管我可以验证我加载的类都很好(clazz
输出它实际上是Example
)。
我想使用该getLoadedClasses()
方法的原因是因为我动态地重新加载 groovy,所以在重新加载时我还想清除元注册表(详见此处:https ://stackoverflow.com/a/10484023/258813 ) -因此计划使用以下代码:
for (Class c : localGroovyClassLoader.getLoadedClasses()){
GroovySystem.getMetaClassRegistry().removeMetaClass(c);
}
但显然,如果getLoadedClasses()
尽管刚刚加载了一个类,但返回 0,我将无法运行上述代码。
谢谢