6

我不断在 PermGen 中为我的环境检测 OOM:

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

我知道 String.intern() 问题 - 但我没有足够有价值的用法。MaxPermGen 大小的增加没有影响(从 128 Mb 到 256 Mb)。

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

谢谢你的帮助

4

2 回答 2

13

看到这个注释

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

新的类对象被放置到 PermGen 中,因此占用了越来越多的空间。无论您将 PermGen 空间做得有多大,在足够的部署之后,它都将不可避免地达到顶峰。您需要做的是采取措施冲洗 PermGen,以便稳定其大小。有两个 JVM 标志可以处理这种清理:

-XX:+CMSPermGenSweepingEnabled

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

-XX:+CMSClassUnloadingEnabled

此设置告诉 PermGen 垃圾收集扫描对类对象采取操作。默认情况下,类对象获得豁免,即使在垃圾回收期间访问 PermGen 空间也是如此。

于 2011-04-12T12:38:34.803 回答
8

在类加载器泄漏时重新部署应用程序时,您通常会遇到此错误,因为这意味着您的所有类都被再次加载,而旧版本仍然存在。

有两种解决方案:

  • 重新启动应用服务器而不是重新部署应用程序 - 简单,但烦人
  • 使用探查器调查并修复泄漏。不幸的是,类加载器泄漏很难查明。
于 2011-04-12T12:39:35.810 回答