java - 如何解决 JBoss 中的 OutOfMemoryError 错误?

标签 java jboss out-of-memory

我在 JBoss 6 上运行的 Java EE 6 应用程序最近开始出现内存问题。

情况

  • 生产服务器。
  • 使用 JPA2/Hibernate 和默认缓存设置的中小型应用程序。约 170 个类(class)。
  • 数据库大小约为 1.8GB,其中 90% 属于二进制数据,只需由 servlet 获取,无需任何特殊缓存。
  • session 超时最近从 2 小时增加到 10 小时。
  • JVM 配置:-Xrs -Xms1024M -Xmx1024M -XX:MaxPermSize=512M -Dsun.rmi.dgc.client.gcInterval=3600000 -server
  • JBoss 作为服务运行。
  • ViewScope 中的几乎所有 Controller 类

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

  • 我该如何解决这些 OOME 问题? JConsole 找不到作为服务运行的 JVM。理想情况下,我必须能够检查相关对象(例如 session )才能找到内存窃贼。

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

最佳答案

session 在 JBoss 中使用一定量的内存似乎是合乎逻辑的。增加 session 超时可能会导致内存中随时出现更多 session - 因此您可能会增加应用程序的内存需求。

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

如果这只是延迟了您的 OOME,您将需要分析您的堆。启用:

-XX:-HeapDumpOnOutOfMemoryError

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

关于java - 如何解决 JBoss 中的 OutOfMemoryError 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9704881/

相关文章:

java - 线程的无休止创建和运行是否会导致 PermGen OOM?

java - Hazelcast 不遵守分布式 map 的最大大小

java - 如何向 OkHttp 请求拦截器添加 header ?

java - 如何在Android中读取HttpResponse?

java - JBoss 是否缓存类文件?

Jenkins 构建抛出内存不足错误

java - 如何将流与干扰方法和构造函数一起使用,为什么不使用 .peek()?

java - 为什么在同一实体上调用 getOne() 后 "findById()"返回代理?

java - 关于servlet映射的基本问题

重启后jboss忽略requires_new