jarファイルを動的にロードするために、子優先のUrlClassLoaderがあります。次に、リフレクションを実行して、ロードされた jar ファイル内のメソッドを呼び出します。完了したら、クラスローダーをアンロードすることを好みます。次に、ストレス テスト コードを実行して、コードがスムーズに実行されることを確認します。基本的に、私がやろうとしているのは、ループ ステートメント内で jar をロードおよびアンロードすることです。これが私のコードです:
for (int i = 0; i < 1000; i++) {
//Just to show the progress
System.out.println("LOAD NUMBER : " + i);
ChildFirstURLClassLoader classLoader = null;
try {
File file = new File("C:\\library.jar");
String classToLoad = "com.test.MyClass";
URL jarUrl = new URL("file:" + file.getAbsolutePath());
classLoader = new ChildFirstURLClassLoader(new URL[] {jarUrl}, null);
Class<?> loadedClass = classLoader.loadClass(classToLoad);
Method method = loadedClass.getDeclaredMethod("execute",
new Class[] {});
ClassLoader currCl= Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(classLoader);
method.invoke(null);
Thread.currentThread().setContextClassLoader(currCl);
method = null;
loadedClass = null;
} finally {
if (classLoader != null) {
classLoader.close();
classLoader = null;
}
}
}
このコードを JDK1.6 で実行すると、classLoader.close();
ステートメントなしで、そのコードは完全に実行されます。しかし、JDK1.7 に変更すると、時々java.lang.OutOfMemoryError: PermGen space
エラーが発生します。残念ながら、一貫性のない方法で発生します。