簡體   English   中英

編譯的Groovy類 - GC

[英]Compiled Groovy Classes - GC

這是對前一個問題的回答: 使用Java中的GroovyClassLoader - 類不是GC

我以前使用自定義groovy類加載器在java環境中加載Groovy類,並且為了正確地使用GC,我必須明確地清除元類注冊表:

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

我現在已經切換到將groovy類預編譯為JAR,我正在通過普通的java類加載器加載,現在我在嘗試重新加載更新的類時再次看到perm gen內存泄漏。

任何人都知道我是否需要做一些特別的事情來獲得我的課程GC'd? 我在運行時動態地向一些groovy添加構造函數/方法,所以假設我仍然需要清除metaClassRegistry?

上面的代碼(顯然)不起作用,因為我不再使用groovyClassLoader,但我也試過迭代metaClassRegistry並且只為注冊表返回null:

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

這是同樣的問題,但只需要一個不同的路線來進入MetaClassRegistry。 以下代碼完成了這項工作:

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

(注意,這是從一個已編譯的groovy類中調用的,所以使用相同的classloader / metaClassRegistry)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM