我正在研究一些JVM bsaed代码中的内存泄漏(在Java环境中运行的groovy)。
我有一个简单的Java测试类,我用它来研究围绕Groovy类加载的各种行为,我正在运行以下代码(来自普通Java):
GroovyClassLoader localGroovyClassLoader = new GroovyClassLoader();
Class clazz = localGroovyClassLoader.loadClass("com.test.Example", true, false, true);
Example
只是一个简单的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,我将无法运行上述代码。
由于
答案 0 :(得分:1)
您是否在父类加载器中有com.test.Example
编译的类?调用getLoadedClasses
只会为您提供此GCL直接加载的类。如果它能够通过委托给它的父加载器来找到一个特定的类,那么它就不需要加载类本身,并且该类将不会包含在getLoadedClasses
中。