Не удается выгрузить классы 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?


person Itay Hudedi    schedule 24.01.2016    source источник
comment
У вас есть эта ошибка, если вы не пытаетесь это сделать?   -  person Roman C    schedule 24.01.2016
comment
Вы пытались установить более новую версию groovy? Просто посмотреть, решило ли это проблему? Затем вы могли бы передать это людям, которые решают, что вещи не могут быть обновлены, чтобы помочь аргументировать ваши доводы в пользу здравомыслия.   -  person tim_yates    schedule 24.01.2016
comment
Проблема возникает только при использовании Groovy.   -  person Itay Hudedi    schedule 24.01.2016
comment
Я не могу обновить свою классную версию, потому что это устаревшая система.   -  person Itay Hudedi    schedule 24.01.2016
comment
Если в нем нельзя исправить баги, то к чему вопрос? Просто оставьте его гноиться   -  person tim_yates    schedule 24.01.2016
comment
Вы пытались время от времени создавать новую оболочку, а не повторно использовать старую? Но я знаю, что многие вещи были исправлены после groovy 1.0. Я все еще думаю, что вам нужно обновить   -  person tim_yates    schedule 24.01.2016
comment
Какую версию Java и настройки сборки мусора вы используете? Для некоторых стратегий требуются определенные флаги JVM, чтобы сообщить ему о сборе из permgen, поэтому, если у вас их нет, сборщик мусора даже не будет пытаться его очистить - см.: stackoverflow.com/a/28446672/258813   -  person rhinds    schedule 25.01.2016


Ответы (1)


Причина, по которой у вас возникает эта проблема с Groovy, связана с характером работы таких языков сценариев, как Groovy. Они создают много дополнительных объектов класса за кулисами, что приводит к увеличению требований к пространству PermGen.

Вы не можете принудительно удалить класс, загруженный в пространство PermGen. Однако вы можете увеличить пространство PermGen:

Или для дополнительных параметров, таких как настройки JVM для увеличения пространства PermGen и добавления настроек, позволяющих выгружать классы PermGen во время GC, см. этот пост:

Увеличить пространство permgen

person pczeus    schedule 25.01.2016