Не удается выгрузить классы Groovy - PermGen Erros
У меня есть устаревшая система, которая широко использует Groovy
версия 1.0 и на данный момент не могу обновить Groovy
в обновленной версии. Время от времени я получаю PermGen
ошибка из-за того, что все Groovy
классы / скрипты хранятся в памяти, даже если никто их больше не использует.
Я пытаюсь выяснить, как правильно выгружать эти классы после того, как я их закончу.
Я использую следующий код для создания объекта Script:
GroovyShell shell=new GroovyShell();
Script script = shell.parse("ANY_TEXT");
.....
И я пытаюсь следующий код, чтобы выгрузить сгенерированный класс:
MetaClassRegistry metaClassRegistry = MetaClassRegistry.getIntance(0);
metaClassRegistry.removeMetaClass(script.getMetaClass().getClass());
metaClassRegistry.removeMetaClass(script.getClass());
metaClassRegistry.removeMetaClass(script.getBinding().getClass());
script.setBinding(null);
script.setMetaClass(null);
script = null;
К сожалению, это не работает, потому что я продолжаю получать PermGen
ошибка. Как я могу выгрузить Groovy
классы и держать PermGen
размер разумный?
1 ответ
Причиной возникновения этой проблемы с Groovy является характер работы языков сценариев, таких как Groovy. Они создают множество дополнительных объектов Class за кулисами, в результате чего ваши требования к пространству PermGen возрастают.
Вы не можете принудительно удалить класс, загруженный в пространство PermGen. Однако вы можете увеличить пространство PermGen:
Или для дополнительных опций, таких как настройки JVM для увеличения пространства PermGen и добавления настроек, позволяющих выгрузить классы PermGen во время GC, см. Этот пост: