我正在使用 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"
我想知道以下内容:
- Tomcat 使用的全部内存应该是 256MB 还是 Tomcat 因其他原因消耗其他内存?
- 如何监控 Tomcat 使用的内存以避免达到 PemGen 的最大大小?
另请注意,我有 3 个 Tomcat,它们具有与以前相同的 PermGen 配置,在具有 8 GB Ram 的同一台物理服务器上运行,这让我担心将 PermGen 最大大小增加到 512MB 不会影响物理服务器内存。
最佳答案
Tomcat 中的 Permgen OOME 通常是由于两种情况的组合:
热重新部署。
内存泄漏,其中某些引用导致旧类加载器及其所有依赖对象保持可访问状态。
因此,有几种方法可以避免这个问题:
不要进行热重新部署。或者每隔几个热重新部署重新启动一次。
追踪并修复与类加载器相关的存储泄漏。
增加 permgen 大小不会阻止问题,但可能会增加 OOME 问题之间的间隔。 (或者允许您减少 Tomcat 的完全关闭/重启次数。)
您的问题:
1) Is the whole memory used by Tomcat should be 256MB or Tomcat consumes other memory for other reasons ?
见上文。它不是特定的 Tomcat,尽管 Tomcat 特别容易出现这种情况。 (显然,Hibernate 可能太……我相信,由于它使用了动态代理。)
2) How can I monitor the memory used by Tomcat to avoid reaching PemGen max size ?
有一些方法可以监控内存使用情况;例如附加代理。但是,这些并不能解决问题。 IMO,更改生产服务器的管理程序会更简单,这样您就不需要进行热重新部署。
关于java - Tomcat 内存使用(PermGen),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18555827/