java - Tomcat 内存使用(PermGen)

标签 java tomcat memory-management out-of-memory 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 的最大大小?

另请注意,我有 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/

相关文章:

Java 服务器-客户端 readLine() 方法

spring - Tomcat 7、Raspberry Pi Spring-boot、Java 1.8、maven 应用程序、java.lang.UnsupportedClassVersionError、jhipster 项目

java - JMX 与 Apache CXF 集成

Apache Web 服务器重定向发布请求

java - 了解 equals-实现 : type-check and THEN type-cast

java - 如何在 linux 中使用命令行编译 eclipse 项目?

java - 是否可以在 java.nio(或常规 java io)中 fork (克隆)流?

ios - 与传递对象保持循环

对象组合 : storing references vs. 引用的 ID

c++ - 我怎样才能安全地使用 strcpy