Tomcat内存使用情况(PermGen)

我正在使用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 max size?

另外请注意,我有3个拥有相同PermGen配置的Tomcats,运行在8 GB Ram的同一物理服务器上,这让我害怕将PermGen max size增加到512MB而不影响物理服务器内存。

Tomcat中的Permgen OOME通常由两部分组成:

  • 热重新部署。

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

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

  • 不要做热重新配合。 或者重新启动每一次热重新部署。

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

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


你的问题:

1)Tomcat使用的整个内存是256MB还是Tomcat因其他原因消耗其他内存?

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

2)如何监控Tomcat使用的内存以避免达到PemGen max size?

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

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