PermGen Out of Memory原因

Ram*_*man 6 java jboss out-of-memory permgen

我经常在PermGen中检测我的环境中的OOM:

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

我知道String.intern()问题 - 但我没有足够的宝贵用法.MaxPermGen尺寸的增加不会产生任何影响(从128 Mb到256 Mb).

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

谢谢你的帮助

Dea*_*mer 13

请参阅此说明

  • 将JDBC驱动程序放在common/lib中(如tomcat文档所述)而不是WEB-INF/lib
  • 不要将commons-logging放入WEB-INF/lib,因为tomcat已经引导它了

新的类对象被放入PermGen中,从而占用越来越多的空间.无论你制作PermGen空间有多大,它都将在经过足够的部署后不可避免地达到顶峰.你需要做的是采取措施冲洗PermGen,以便你可以稳定它的大小.有两个JVM标志可以处理这种清理:

-XX:+CMSPermGenSweepingEnabled
Run Code Online (Sandbox Code Playgroud)

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

-XX:+CMSClassUnloadingEnabled
Run Code Online (Sandbox Code Playgroud)

此设置告诉PermGen垃圾收集扫描对类对象执行操作.默认情况下,即使在garabage集合期间访问PermGen空间时,类对象也会获得免除.

  • CMSPermGenSweepingEnabled自JDK6起不推荐使用,此外+ CMSPermGenSweepingEnabled仅在启用+ UseConcMarkSweepGC时才有用,否则无用 (3认同)

Mic*_*rdt 8

在具有类加载器泄漏时重新部署应用程序时通常会出现此错误,因为这意味着旧版本保留时会再次加载所有类.

有两种解决方案:

  • 重新启动应用服务器而不是重新部署应用程序 - 简单但令人讨厌
  • 使用分析器调查并修复泄漏.不幸的是,类加载器泄漏很难确定.