【问题标题】:PermGen Out of Memory reasonsPermGen 内存不足的原因
【发布时间】:2011-08-03 20:43:28
【问题描述】:

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

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

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

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

感谢您的帮助

【问题讨论】:

    标签: java jboss out-of-memory permgen


    【解决方案1】:

    See this note

    • 将 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 空间时,类对象也会获得豁免。

    【讨论】:

    • CMSPermGenSweepingEnabled 自 JDK6 起已弃用,此外 +CMSPermGenSweepingEnabled 仅在启用 +UseConcMarkSweepGC 时有用,否则无用
    • @PMDUBIK-INGENIERIE 我的英雄,在搜索您对+UseConcMarkSweepGC 的评论 2 小时后,permgen 扫描确实有效。你有这么多的答案告诉人们使用CMSPermGenSweepingEnabled有人会提到你必须实际添加另一个标志...... Tomcat实际上可以重新部署而不会占用永久空间。
    【解决方案2】:

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

    有两种解决方案:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-18
      • 2020-12-09
      • 2014-05-12
      • 2023-03-08
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多