2011-04-12 62 views
6

我不断地检测OOM在PermGen的我的环境:PermGen的内存原因

  1. 的Java 6
  2. 的jboss-4.2.3
  3. 不是一个大网络应用

我了解String.intern()问题 - 但我没有足够的有价值的用法。 MaxPermGen大小的增加没有采取任何力量(从128 Mb到256 Mb)。

还有什么其他原因可以为PermGen引用OOM? 在这种情况下(策略,工具等),哪种调查方式最好?

感谢所有帮助

回答

13

See this note

  • 在common/lib目录将JDBC驱动程序(如Tomcat文档说),而不是在WEB-INF/lib目录
  • 不要把共享记录进入WEB-INF/lib,因为tomcat已经引导了它

新的类对象被放置到PermGen中并因此占用越来越多的空间。无论您创建PermGen空间的规模有多大,在部署完成后都不可避免地被淘汰出局。您需要做的是采取措施冲洗PermGen,以便您可以稳定其大小。有两个JVM标志可以处理这种清理:

-XX:+CMSPermGenSweepingEnabled 

此设置包含垃圾收集运行中的PermGen。默认情况下,PermGen空间永远不会包含在垃圾回收中(因此无限制地增长)。

-XX:+CMSClassUnloadingEnabled 

该设置告诉PermGen垃圾收集扫描对类对象采取行动。默认情况下,即使在garabage集合期间访问PermGen空间时,类对象也会获得豁免。

+3

CMSPermGenSweepingEnabled被弃用JDK6的,而且只有当+ UseConcMarkSweepGC启用,否则它是无用的 – 2013-07-27 20:04:58

+0

@ PMDUBIK-INGENIERIE我心目中的英雄,2个小时'搜索您的评论后+ CMSPermGenSweepingEnabled是有用+ UseConcMarkSweepGC'使得PermGen的扫实际工作。你会有很多答案告诉人们使用'CMSPermGenSweepingEnabled',有人会提到你必须实际添加另一个标志... Tomcat实际上可以重新部署,而不需要吸取permgen空间。 – 2015-02-19 03:09:47

8

当您在重新部署应用程序时遇到classloader leak时,通常会出现此错误,因为这意味着您的所有类都会在老版本停留时再次加载。

解决办法有两个:

  • 重新启动应用程序服务器,而不是重新部署应用程序 - 简便,但恼人的
  • 调查,并用分析器修复泄漏。不幸的是,类加载器泄漏可能很难查明。