如何解决JBoss中的OutOfMemoryError问题?

问题描述:

我在JBoss 6上运行的Java EE 6应用程序最近开始有内存问题。如何解决JBoss中的OutOfMemoryError问题?

形势

  • 生产服务器。
  • 使用JPA2/Hibernate进行默认缓存设置的中小型应用程序。 〜170班。
  • 数据库大小〜1.8gb,其中90%属于二进制数据,由servlet简单地取回而没有任何特殊的缓存。
  • 会话超时最近从2个小时增加到10
  • JVM配置:-Xrs -Xms1024m -Xmx1024M -XX:MaxPermSize参数= 512M -Dsun.rmi.dgc.client.gcInterval = 3600000 -server
  • 的JBoss作为服务运行。
  • 几乎所有控制器类中ViewScope

两个问题考虑到这些事实:

  • 我将如何解决这些OOMEs? JConsole未找到作为服务运行的JVM。理想情况下,我必须能够检查诸如会话之类的相关对象以找到记忆小偷。

  • 这个OOME是合法的吗,考虑到增加的会话超时,解决方案只是增加堆大小?该应用程序自2011年9月以来一直在使用,没有任何早期的内存问题。会话超时大约在两个月前大幅增加。

+0

对不起,我之前没有进一步处理这个问题,现在似乎已经解决了。堆转储参数将是一个很好的起点,问题再次出现,将VisualJVM和类似于生产服务器的附件看起来很难。无论如何,我会接受你的答案,因为它包含堆分析技巧。 – 2012-06-25 12:54:45

这似乎是合乎逻辑的会话将使用一定量的内存在JBoss中。增加会话超时可能会导致在任何时候会在内存中出现更多会话 - 所以您可能会增加应用程序的内存需求。

最简单的(初始)解决方案是增加堆应用程序的分配。例如,设置-Xmx2g(这将JVM内存加倍为2 GiB - 当前设置为1 GiB)。显然,你的系统应该有足够的物理内存可用。

如果这只是延迟你的OOME,你会想分析你的堆。启用:

-XX:-HeapDumpOnOutOfMemoryError

这将创建一个堆的物理转储,以供分析。你可能会发现你有内存泄漏,或者只是每个应用程序会话都有一定的内存占用 - 然后要么限制会话,要么增加适合的内存分配。

VisualJVM是JDK中包含的很棒的工具,您可以使用它来诊断那种错误。为了与JBoss一起工作,您可以查看this

VisualVM有能力提取和分析堆转储。在那里您可以查看所有加载的类,每个类的所有实例以及每个实例的内存分配。有了这些信息,您可以更好地找到问题的原因。