3

我正在使用 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 而不影响物理服务器内存。

4

2 回答 2

3

Tomcat 中的 Permgen OOME 通常是由于以下两件事的结合:

  • 热重新部署。

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

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

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

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

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


你的问题:

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

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

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

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

于 2013-09-01T06:36:21.973 回答
0

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

于 2013-09-01T06:46:53.697 回答