응용 프로그램에서 GroovyShell의 인스턴스를 반복적으로 작성하고 사용자 정의 스크립트를 실행합니다. 이 작업을 수행 할 때 Java 6 및 Java 7의 perm gen 공간이 채워지고 클래스가 언로드되지 않는 문제가 발생합니다. Groovy 2.4.7을 사용하고 있습니다. 나는 다음과 같은 VM 인수를 사용하고Groovy Shell을 반복적으로 사용하면 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");
}
}
}
:이 문제는 다음 코드를 재현 할 수
-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를 실행해도 작동하지 않습니다.
클래스를 PermGen 공간에서 제거하도록 여기에서 클래스를 언로드하거나 GC를 트리거하는 방법이 있습니까?
감사합니다. @Nicholas! 필자는 Java 6 및 7에서이를 테스트했으며 클래스는 두 변형 버전을 언로드했습니다 (다중 스레드 시나리오에서도). 그래도 Groovy Jira에 결함을 제기 할 것입니다. 제 의견으로는 Groovy Jira가 사용자가 아닌 Groovy 자체에서 처리해야하기 때문입니다. –