无法卸载Groovy类 - PermGen Erros

时间:2016-01-24 07:51:56

标签: groovy permgen groovyclassloader

我有一个广泛使用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 个答案:

答案 0 :(得分:0)

您遇到Groovy这个问题的原因是由于Groovy等脚本语言的工作原理。它们在幕后创建了许多额外的Class对象,导致PermGen空间需求增加。

您无法强制删除加载到PermGen空间中的类。但是,您可以增加PermGen空间:

或者对于其他选项,例如JVM设置来增加PermGen空间并添加设置以允许在GC期间卸载PermGen类,请参阅以下文章:

Increase permgen space