12

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エラーが発生します。残念ながら、一貫性のない方法で発生します。

4

1 に答える 1

2

リークの原因を確認する最も簡単な方法は、プロファイラーを使用してメモリ使用量を監視することです。JProfiler または VisualVM を試してください。漏れの正確な場所を特定することができ、それを修正できるかどうか、およびどのように修正できるかについての手がかりも得られます。

于 2012-12-21T09:11:58.917 に答える