我经常在PermGen中检测我的环境中的OOM:
我知道String.intern()问题 - 但我没有足够的宝贵用法。 增加MaxPermGen尺寸不会产生任何影响(从128 Mb到256 Mb)。
其他什么原因可以为PermGen调用OOM? 在这种情况下(策略,工具等),调查的最佳情况是什么?
感谢您的帮助
答案 0 :(得分:13)
新的类对象被置于PermGen中,因此占用了越来越多的空间。无论你制作PermGen空间有多大,它都将在经过足够的部署后不可避免地达到顶峰。你需要做的是采取措施冲洗PermGen,以便你可以稳定它的大小。有两个JVM标志可以处理这种清理:
-XX:+CMSPermGenSweepingEnabled
此设置包括垃圾收集运行中的PermGen。默认情况下,PermGen空间永远不会包含在垃圾收集中(因此无边界地增长)。
-XX:+CMSClassUnloadingEnabled
此设置告诉PermGen垃圾收集扫描对类对象执行操作。默认情况下,即使在garabage集合期间访问PermGen空间时,类对象也会获得免除。
答案 1 :(得分:8)
在使用classloader leak时重新部署应用程序时,通常会出现此错误,因为这意味着旧版本保留时会再次加载所有类。
有两种解决方案: