【发布时间】:2013-07-29 16:59:47
【问题描述】:
这是对上一个问题的后续: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)
}
【问题讨论】:
标签: java memory-leaks groovy garbage-collection