0

我有一个广泛使用Groovy1.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合理的大小?

4

1 回答 1

0

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

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

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

增加永久空间

于 2016-01-25T14:22:46.333 回答