【发布时间】:2012-04-08 07:51:57
【问题描述】:
我在服务器 (tomcat) 上重复部署-取消部署相同战争文件的操作导致 PermGen OutOfMemoryError。我的目标是确保在未部署战争时卸载所有类。
这是我的一门课:
public class ClassA {
//static variables & methods
//instance variables & methods
private EnumInsideClassA myState = EnumInsideClassA.VALUE1;
private enum EnumInsideClassA
{
VALUE1,
VALUE2
}
}
当我清除 ClassA 的所有引用时,我看不到 ClassA,并且在取消部署战争时它被卸载。但是,我仍然看到枚举引用并且 ClassA$EnumInsideClassA 没有被卸载。
'myState' 实例变量没有 getter,它只会与 ClassA 一起使用
感谢任何帮助
【问题讨论】:
-
你试过JVM参数"-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"吗?这是一个类似的问题:link
-
感谢您的回复。是的,我有一段时间试过了。我现在又试了一次。但是,内部类(枚举)没有被清理。还有一个原因是 ClassA 在没有这些 JVM 选项的情况下仍然被卸载。