我不断地检测OOM在PermGen的我的环境:PermGen的内存原因
- 的Java 6
- 的jboss-4.2.3
- 不是一个大网络应用
我了解String.intern()问题 - 但我没有足够的有价值的用法。 MaxPermGen大小的增加没有采取任何力量(从128 Mb到256 Mb)。
还有什么其他原因可以为PermGen引用OOM? 在这种情况下(策略,工具等),哪种调查方式最好?
感谢所有帮助
我不断地检测OOM在PermGen的我的环境:PermGen的内存原因
我了解String.intern()问题 - 但我没有足够的有价值的用法。 MaxPermGen大小的增加没有采取任何力量(从128 Mb到256 Mb)。
还有什么其他原因可以为PermGen引用OOM? 在这种情况下(策略,工具等),哪种调查方式最好?
感谢所有帮助
新的类对象被放置到PermGen中并因此占用越来越多的空间。无论您创建PermGen空间的规模有多大,在部署完成后都不可避免地被淘汰出局。您需要做的是采取措施冲洗PermGen,以便您可以稳定其大小。有两个JVM标志可以处理这种清理:
-XX:+CMSPermGenSweepingEnabled
此设置包含垃圾收集运行中的PermGen。默认情况下,PermGen空间永远不会包含在垃圾回收中(因此无限制地增长)。
-XX:+CMSClassUnloadingEnabled
该设置告诉PermGen垃圾收集扫描对类对象采取行动。默认情况下,即使在garabage集合期间访问PermGen空间时,类对象也会获得豁免。
当您在重新部署应用程序时遇到classloader leak时,通常会出现此错误,因为这意味着您的所有类都会在老版本停留时再次加载。
解决办法有两个:
CMSPermGenSweepingEnabled被弃用JDK6的,而且只有当+ UseConcMarkSweepGC启用,否则它是无用的 – 2013-07-27 20:04:58
@ PMDUBIK-INGENIERIE我心目中的英雄,2个小时'搜索您的评论后+ CMSPermGenSweepingEnabled是有用+ UseConcMarkSweepGC'使得PermGen的扫实际工作。你会有很多答案告诉人们使用'CMSPermGenSweepingEnabled',有人会提到你必须实际添加另一个标志... Tomcat实际上可以重新部署,而不需要吸取permgen空间。 – 2015-02-19 03:09:47