В приложении я неоднократно создаю экземпляры GroovyShell и запускаю на них собственные скрипты. При этом возникают проблемы, связанные с тем, что пространство perm gen в Java 6 и Java 7 заполняется, а классы не выгружаются. Я использую Groovy 2.4.7. Проблема может быть воспроизведена с помощью следующего кода:Повторное использование Groovy Shells приводит к заполнению пространства PermGen
import groovy.lang.GroovyShell;
public class Demo {
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10000000; i++) {
GroovyShell gs = new GroovyShell();
Object result = gs.evaluate(" 'Hello, World';");
assert result.equals("Hello, World");
}
}
}
Я использую следующие VM аргументы:
-verbose:class -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+CMSClassUnloadingEnabled -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:+TraceClassUnloading -XX:MaxPermSize=16M -XX:+UseConcMarkSweepGC -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:-UseParNewGC
Когда я выполнить тест из выше, PermGen полна после того, как чуть более 2000 итераций , Кроме того, запуск GC вручную не работает.
Есть ли способ принудительно разгрузить класс или запустить GC, чтобы классы были удалены из пространства PermGen?
Спасибо @ Николас! Я тестировал это с помощью Java 6 и 7, а классы были выгружены как версиями вариантов, так и в многопоточных сценариях. Тем не менее, я создам дефект на Groovy Jira, потому что, по моему мнению, это должен обрабатывать сам Groovy, а не его пользователи. –