Groovy обновление вызывает массу мертвых GroovyClassLoaders в PermGen

У меня есть проект Java 7, который запускает сценарии каждые n минут по n процессов. Вот пример кода, который запускает сценарии.

ScheduledFuture scheduledFuture = scheduledService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                try (GroovyClassLoader cl = new GroovyClassLoader()) {
                    // Load up reusable script modules in the class loader
                    Class scriptClass = cl.parseClass(scriptSource);
                    Foo script = optimizationClass.newInstance();

                    // Tell Groovy that we don't need class meta info
                    GroovySystem.getMetaClassRegistry().removeMetaClass(scriptClass);
                    script.run();
                    cl.clearCache();
                } catch (IOException e) {
                    LOGGER.error("Failed to cleanup Groovy class loader, this will cause a memory leak", e);
                }
            }
        }, 0, scheduledRun, TimeUnit.SECONDS);

        scheduledFuture.get();

По какой-то причине в Groovy 2.1.7 нет утечки памяти в Perm Gen. При обновлении до Groovy 2.3.8 или Groovy 2.2.0 Perm Gen продолжает заполняться мертвыми загрузчиками классов Groovy.

0x000000071ada2cd0 33 488160 0x000000071b2493c8 мертвый заводной / языки / GroovyClassLoader $ InnerLoader @ 0x00000007c7b70ef8 0x00000007265883b8 33 488160 0x0000000725837270 мертвый заводной / языки / GroovyClassLoader $ InnerLoader @ 0x00000007c7b70ef8 0x00000007157b5da0 26 370736 0x000000072326f468 живой орг / Codehaus / заводной / выполнения / callsite / CallSiteClassLoader @ 0x00000007c831d388 0x000000071ada1fb0 32 423944 0x000000071af03a98 мертвый заводной / языки / GroovyClassLoader $ InnerLoader @ 0x00000007c7b70ef8 0x0000000719d605b0 32 456520 0x000000071af04798 мертвые заводные / языки / GroovyClassLoader $ InnerLoader @ 0x00000007c7b70ef8 0x0000000725b82500 0 0 0x000000072326f468 мертвых заводные / языки / GroovyClassLoader @ 0x00000007c74c33e8 0x00000007263eef80 34 532448 0x0000000726d5c678 мертвых заводные / языки / GroovyClassLoader $ InnerLoader @ 0x00000007c7b70ef8 0x000000072687b3c8 33 485288 0x0000000726c36340 мертвый groovy / lang / GroovyClassLoader $ InnerLoader @ 0x00000007c7b70ef8 0x0000000725d56db0 33 485288 0x000000072607bccL мертвый шпунтовое поле дер @ 0x00000007c7b70ef8

Я жду, пока не произойдет Full GC, но похоже, что любая версия после Groovy 2.2 заставляла Perm Gen заполняться. Я проверил заметки о выпуске между версией, в которой находился, вплоть до обновленной версии, и я не заметил никаких изменений, которые могли бы вызвать это.

Я проверил здесь для похожих проблем и попробовал несколько предложений, но не повезло. Есть идеи относительно причины?

Обновить:
Я сделал Diff на GrepCode на GroovyClassLoader с 2.1.7 до 2.2.0, и никаких изменений не было. Я также взял файл дампа кучи, когда приложение работало, и не было никаких путей к корням GC для сильных ссылок.

Проблема, кажется, где-то здесь:

Class scriptClass = cl.parseClass(scriptSource);
Foo script = scriptClass.newInstance();

Когда я не компилирую скрипт, я получаю 0 Groovy ClassLoaders в Perm Gen. Когда я компилирую скрипт, но не запускаю его, я получаю мертвый Groovy ClassLoaders.

Обновить:
Нашел код, который вызывает утечку.

Foo script = scriptClass.newInstance();

Не уверен, как это исправить, так как мне нужно создать новый экземпляр для запуска сценария.

Ответы на вопрос(2)

Ваш ответ на вопрос