2013-07-29 30 views
3

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

使用自定义类加载器的Groovy我以前装的Groovy类在Java环境,并让他们GC'd正确,我不得不显式地清除元类注册表像这样:

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

我现在已经切换到预编译的Groovy类中,我通过一个普通的Java类加载器加载一个JAR,和我现在看到的烫发根内存泄漏当我尝试重新加载更新的类时。

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

上面的代码不工作(明显),因为我不再使用groovyClassLoader,但我也尝试过迭代metaClassRegistry和刚刚返回null注册表:

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

回答

0

这是同样的问题,但只需要一个不同的路线来到MetaClassRegistry。下面的代码做的工作:

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

(注意,这是从编译的Groovy类,所以使用相同的类加载器/ metaClassRegistry的一个叫)