1

一部の JVM ベース コード (Java 環境で実行されている groovy) でのメモリ リークを調査しています。

Groovy クラスのロードに関するさまざまな動作を調査するために使用している単純な Java テスト クラスがあり、次のコードを (プレーンな Java から) 実行しています。

GroovyClassLoader localGroovyClassLoader = new GroovyClassLoader();
Class clazz = localGroovyClassLoader.loadClass("com.test.Example", true, false, true);

Example単純なGroovyクラスです(私のダミーケースであるため、特に何もしません)。

ここで、上記のコードの直後に次のログを記録するとします。

localGroovyClassLoader.getLoadedClasses().length

ロードされたクラスがすべて正常であることを確認できるにもかかわらず、0 がログに記録されます (clazz実際にはそうであることが出力されますExample)。

このメソッドを使用したい理由はgetLoadedClasses()、その場で Groovy を動的にリロードしているためです。そのため、リロード時にメタ レジストリもクリアする必要があります (詳細はこちら: https://stackoverflow.com/a/10484023/258813 ) -次のコードを使用することを計画していました。

for (Class c : localGroovyClassLoader.getLoadedClasses()){
    GroovySystem.getMetaClassRegistry().removeMetaClass(c);
}

しかし明らかに、getLoadedClasses()クラスをロードしたばかりなのに 0 が返された場合、上記のコードを実行することはできません。

ありがとう

4

1 に答える 1

1

com.test.Example親クラスローダにコンパイルされたクラスがありますか? を呼び出すgetLoadedClassesと、この GCL 自体が直接ロードしたクラスのみが得られます。親ローダーに委譲することによって特定のクラスを見つけることができた場合、クラス自体をロードする必要はなく、そのクラスは に含まれませんgetLoadedClasses

于 2013-01-22T17:41:33.143 に答える