编译的Groovy类 - GC

时间:2013-07-29 16:59:47

标签: java memory-leaks groovy garbage-collection

这是对上一个问题的跟进:Using GroovyClassLoader from Java - Classes not GC'd

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

(注意,这是从一个已编译的groovy类调用的,所以使用相同的classloader / metaClassRegistry)