2017-10-05 2 views
2

からクラスを:メモリリークを作成するのは簡単ですので、なGroovy:再コンパイルしたファイルとメモリリーク<a href="http://docs.groovy-lang.org/latest/html/documentation/#groovyclassloader" rel="nofollow noreferrer">ref-doc</a>あたりとして

A GroovyClassLoaderはそれが作成されたすべてのクラスの参照を保持します。特に、同じスクリプトを2回実行すると、文字列の場合は2つの異なるクラスが得られます。 MyClassの等しい

GroovyCodeSource src = new GroovyCodeSource(file) 
    src.cachable = false 
    Class clazz = groovyClassLoader.parseClass src 
    Class clazz1 = groovyClassLoader.parseClass src 
    log.info "$clazz <=> $clazz1 equal: ${clazz == clazz1}" 

ログ出力が常にある

クラスMyClassの< =>クラス:偽

を私が解析するためのソースとしてファイルを使用していますが、オフキャッシュなっ

私がラインsrc.cachable = falseにコメントすると、クラスインスタンスbeco私は平等ですが、基礎となるファイルが変更されても再コンパイルされません。

質問:私はどのようにメモリリークを作成せずにクラスを正しく再コンパイルできますか?

答えて

0

は、いくつかの実験を行った後、私が使用して文字列に戻って切り替えることを考え出しましたinside(クラスとしても表示されます)。

1

私は以下のテストを行い、メモリリークは見られません。

私にとっては、通常のGC作業です。

クラスのインスタンスが生きている間、クラスへのリンクが有効になります。

String src = 'class A {}' 
Class clazz = groovyClassLoader.parseClass src 
log.info groovyClassLoader.loadedClasses.join(', ') 

がロードされたクラスは、クラスは、いくつかのクロージャを持っている場合でも、な長さに変更しないでください:

GroovyCodeSource src = new GroovyCodeSource('println "hello world"', 'Test', '/') 
src.cachable = false 

def cl=this.getClass().getClassLoader() 

for(int i=0;i<1000000;i++){ 
    Class clazz = cl.parseClass src 
    if(i%10000==0)println "$i :: $clazz :: ${System.identityHashCode(clazz)}" 
} 

enter image description here

関連する問題

 関連する問題