Подтвердить что ты не робот

JDK1.7 Утечка памяти ClassLoader

У меня есть первый UrlClassLoader для загрузки файла jar динамически. Затем я делаю отражение для вызова метода в загруженном файле 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. К сожалению, это происходит непоследовательно.

4b9b3361

Ответ 1

Самый простой способ подтвердить, откуда происходит утечка, - использовать профилировщик для мониторинга использования памяти. Попробуйте JProfiler или VisualVM. Это позволит вам точно определить точное местоположение утечки, а также дать вам подсказки относительно того, как и как вы можете исправить это.