Tomcat内存使用(PermGen)

3
我正在使用Tomcat部署一个Web应用程序,并采用以下PermGen配置:
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,还是因为其他原因而占用其他内存?
  2. 如何监控Tomcat使用的内存以避免达到PermGen最大值?
此外,请注意我有3个Tomcat具有相同的先前PermGen配置,在运行于8 GB RAM的同一物理服务器上。这让我担心增加PermGen最大大小到512MB会影响物理服务器的内存。
2个回答

3

Tomcat中的Permgen OOME通常是由以下两个原因造成的:

  • 热部署。

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

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

  • 不要进行热部署。或者每隔一段时间进行重启。

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

增加permgen大小不会解决问题,但很可能会增加OOME问题之间的间隔时间。(或者让您更少地进行完整的Tomcat关闭/重启。)


你的问题:

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

请参见上文。这不是特定于Tomcat,尽管Tomcat特别容易发生这种情况。(显然,Hibernate也可能会发生这种情况...我相信这是由于它使用动态代理。)

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

有监视内存使用情况的方法,例如附加代理。但是,这些方法不会解决问题。在我看来,更简单的方法是更改您的生产服务器管理程序,以便您不需要进行热部署。


@Stephen,你能解释一下为什么热部署会导致这个问题吗? - mosaad
热部署会导致创建新的类加载器。如果存在与类加载器相关的存储泄漏,则会泄漏PermGen。 - Stephen C

0

Tomcat 需要增加 permgen 不是为了自身的需要,而是因为它可以运行多个 Web 应用程序,这些应用程序都将加载自己的类(permgen 主要用于存储类)。您可以使用 jconsole 实用程序查看内存使用情况,转到内存 -> 图表 -> 内存池 Perm Gen。对于我刚刚启动且没有用户 Web 应用程序的 Tomcat 7,它显示最大值为 65M,已使用 6M。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接