4

这是上一个问题的后续:Using GroovyClassLoader from Java - Classes not GC'd

我以前使用自定义 groovy 类加载器在 java 环境中加载 Groovy 类,为了让它们正确 GC,我必须明确清除元类注册表,如下所示:

for(Class<?> c : groovyClassLoader.getLoadedClasses()) {
    GroovySystem.getMetaClassRegistry().removeMetaClass(c);
}

我现在已经切换到将 groovy 类预编译到我通过普通 java 类加载器加载的 JAR 中,现在当我尝试重新加载更新的类时,我再次看到 perm gen 内存泄漏。

任何人都知道我是否需要做一些特别的事情才能让我的课程获得 GC 认证?我在运行时动态地将构造函数/方法添加到一些 groovy 中,所以假设我仍然需要清除 metaClassRegistry?

上面的代码不起作用(显然),因为我不再使用 groovyClassLoader,但我也尝试过迭代 metaClassRegistry 并且只为注册表返回 null:

    def metaClasses = GroovySystem.getMetaClassRegistry().iterator()
    while( metaClasses.hasNext()){
        def thisGuy = metaClasses.next()
        GroovySystem.getMetaClassRegistry().removeMetaClass(thisGuy)
    }
4

1 回答 1

1

这是同样的问题,但只是需要一条不同的路线才能到达 MetaClassRegistry。以下代码完成了这项工作:

def registry = metaClass.getRegistry()
def iterator = registry.iterator()
while ( iterator.hasNext() ){
    def mc = iterator.next()
    registry.removeMetaClass( mc.getJavaClass() )
}

(注意,这是从已编译的 groovy 类之一调用的,因此使用相同的类加载器/metaClassRegistry)

于 2013-07-30T16:52:14.070 回答