[英]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.