这是上一个问题的后续: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)
}