【问题标题】:Compiled Groovy Classes - GC编译的 Groovy 类 - GC
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-25
      • 2010-11-04
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多