1

我正在调查一些 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,我将无法运行上述代码。

谢谢

4

1 回答 1

1

com.test.Example在父类加载器中有编译的类吗?调用getLoadedClasses只会给你这个 GCL 自己直接加载的类。如果它能够通过委托给它的父加载器找到一个特定的类,那么它就不需要加载这个类本身,并且这个类不会被包含在getLoadedClasses.

于 2013-01-22T17:41:33.143 回答