如何解决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月以来一直在使用,没有任何早期的内存问题。会话超时大约在两个月前大幅增加。
答
这似乎是合乎逻辑的会话将使用一定量的内存在JBoss中。增加会话超时可能会导致在任何时候会在内存中出现更多会话 - 所以您可能会增加应用程序的内存需求。
最简单的(初始)解决方案是增加堆应用程序的分配。例如,设置-Xmx2g
(这将JVM内存加倍为2 GiB - 当前设置为1 GiB)。显然,你的系统应该有足够的物理内存可用。
如果这只是延迟你的OOME,你会想分析你的堆。启用:
-XX:-HeapDumpOnOutOfMemoryError
这将创建一个堆的物理转储,以供分析。你可能会发现你有内存泄漏,或者只是每个应用程序会话都有一定的内存占用 - 然后要么限制会话,要么增加适合的内存分配。
对不起,我之前没有进一步处理这个问题,现在似乎已经解决了。堆转储参数将是一个很好的起点,问题再次出现,将VisualJVM和类似于生产服务器的附件看起来很难。无论如何,我会接受你的答案,因为它包含堆分析技巧。 – 2012-06-25 12:54:45