我正在调查一些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,尽管我刚刚装入了一个类,我将不能运行上面的代码。
谢谢
发布于 2013-01-23 01:41:33
在父类加载器中有com.test.Example编译的类吗?调用getLoadedClasses只会给出这个GCL直接加载的类。如果它能够通过委托给它的父类加载器来找到一个特定的类,那么它就不需要加载这个类本身,而且这个类也不会包含在getLoadedClasses中。
https://stackoverflow.com/questions/14461773
复制相似问题