java.lang.OutOfMemoryError:Java 堆空间

Ale*_*lex -1 java jboss

在我们的应用程序中,我们同时拥有 Apache Server(仅适用于前端)和 JBoss 4.1(适用于业务端)。我们使用 Ubuntu 12 作为服务器操作系统。我们的应用程序几乎每隔 2-3 小时就会连续抛出“java.lang.OutOfMemoryError: Java heap space”(所以应用程序开始抛出内存堆不足一小时左右,然后在接下来的 2-3 小时内再次开始正常工作)再次开始抛出内存不足异常)。我们的 Java 内存设置是

-Xms512m -Xmx1024m

我们的服务器有 6 GB 的物理内存。请指导我们是否需要增加 Java 堆大小。如果是,考虑到 6GB 的物理内存,理想的大小应该是多少。

问候, 普拉特克

Seb*_*ias 5

调试您的应用程序。如果您在几个小时后出现 OOM,那么很可能它确实有问题,并且您无法通过添加更多内存来修复它。你只会增加更多的时间,直到它死亡。此外,JBoss 4.1 已经很老了,所以我认为它没有运行任何真正有趣的东西。检查日志中的连接泄漏、堆转储和堆栈跟踪以获取泄漏源头的线索,在非生产环境中运行不同的使用测试并测量每个请求时内存的行为。您甚至可以使用 jmap 和 jdump 在测试之前和之后生成堆转储和堆栈跟踪,以比较测试如何影响事物的状态,或者安排它们以特定时间间隔运行,然后检查哪些对象没有被正确清理由 GC。此外,使用以下选项打开 GC 日志记录和转储:

set JAVA_OPTS=%JAVA_OPTS% -XX:OnOutOfMemoryError="%JAVA_HOME%\bin\jmap -dump:format=b,file=%JBOSS_HOME%\bin\heap_%%p.bin" -XX:ErrorFile=%JBOSS_HOME%\bin\hs_err_pid%%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%JBOSS_HOME%\bin -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -Xloggc:%JBOSS_HOME%\bin\gc-%DATE:~-8,-4%%DATE:~-14,-12%%DATE:~-11,-9%.log -XX:-TraceClassUnloading
Run Code Online (Sandbox Code Playgroud)

这将是 JBOSS_HOME\bin 文件夹中的一般堆转储 (heap_PID.bin)、堆栈跟踪 (hs_err_pidPID.log) 和垃圾收集日志 (gc_DATE.log)(您可以随意调整)。

绝大多数 OOM 是由于应用程序错误造成的,因此在将硬件投入应用程序之前,请始终先查看应用程序。在您确保其他一切都正确之后,硬件就会出现。即使你让 PM 和开发人员讨厌你。

塞巴斯蒂安