【问题标题】:Tomcat memory usage (PermGen)Tomcat 内存使用 (PermGen)
【发布时间】:2013-09-04 12:52:06
【问题描述】:

我正在使用 Tomcat 部署具有以下 PermGen 配置的 Web 应用程序:

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 
-server -Xms1536m -Xmx1536m
-XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m 
-XX:MaxPermSize=256m -XX:+DisableExplicitGC"

我想知道以下几点:

  1. Tomcat 使用的全部内存应该是 256MB 还是 Tomcat 因其他原因消耗了其他内存?
  2. 如何监控 Tomcat 使用的内存以避免达到 PemGen 最大大小?

另外请注意,我有 3 个具有相同先前 PermGen 配置的 Tomcat,运行在具有 8 GB RAM 的同一物理服务器上,这让我害怕将 PermGen 最大大小增加到 512MB 而不影响物理服务器内存。

【问题讨论】:

    标签: java tomcat memory-management out-of-memory permgen


    【解决方案1】:

    Tomcat 中的 Permgen OOME 通常是由两件事共同导致的:

    • 热部署。

    • 内存泄漏,某些引用导致旧的类加载器及其所有依赖对象保持可访问性。

    因此,有几种方法可以避免这个问题:

    • 不要进行热重新部署。或者每隔几次热重新部署重新启动一次。

    • 追踪并修复与类加载器相关的存储泄漏。

    增加 permgen 大小不会阻止问题,但可能会增加 OOME 问题之间的间隔。 (或者允许您不那么频繁地完全关闭/重新启动 Tomcat。)


    你的问题:

    1) Tomcat 使用的全部内存应该是 256MB 还是 Tomcat 因其他原因消耗了其他内存?

    见上文。它不是专门的 Tomcat,尽管 Tomcat 特别容易出现这种情况。 (显然,Hibernate 也可以……我相信,由于它使用了动态代理。)

    2) 如何监控 Tomcat 使用的内存以避免达到 PemGen 最大大小?

    有一些方法可以监控内存使用情况;例如附加代理。但是,这些并不能阻止问题的发生。 IMO,更改生产服务器的管理程序会更简单,这样您就不需要进行热重新部署。

    【讨论】:

    • 非常感谢斯蒂芬,这非常有用。
    • @Stephen 你能解释一下为什么热重新部署会导致这个问题吗?
    • 热重新部署会导致创建新的类加载器。如果存在与类加载器相关的存储泄漏,则会泄漏 permgen。
    【解决方案2】:

    Tomcat 需要增加 permgen 不是为了它自己的需要,而是因为它可以运行多个 webapps,它们都将加载自己的类(permgen 主要用于存储类)。您也可以使用 jconsole util 查看内存使用情况,转到内存 -> 图表 -> 内存池 Perm Gen。对于我刚开始没有用户 webapps 的 Tomcat 7,它显示 65M max 6M used.

    【讨论】:

      猜你喜欢
      • 2012-10-15
      • 2011-12-23
      • 2014-10-04
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 2015-12-25
      • 2013-12-18
      • 2014-05-13
      相关资源
      最近更新 更多