我有一个广泛使用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
大小合理?
答案 0 :(得分:0)
您遇到Groovy这个问题的原因是由于Groovy等脚本语言的工作原理。它们在幕后创建了许多额外的Class对象,导致PermGen空间需求增加。
您无法强制删除加载到PermGen空间中的类。但是,您可以增加PermGen空间:
或者对于其他选项,例如JVM设置来增加PermGen空间并添加设置以允许在GC期间卸载PermGen类,请参阅以下文章: