JBoss 7出现java.lang.OutOfMemoryError: Java heap space问题求助
解决JBoss 7中的java.lang.OutOfMemoryError: Java heap space错误
从你给出的配置和错误堆栈来看,这个堆内存溢出是在字符串拼接、异常堆栈打印的过程中触发的,下面给你梳理具体的分析和解决方案:
一、先临时调整堆内存参数缓解问题
当前你的JAVA_OPTS里堆内存最大值仅设置为2G(-Xmx2G),从错误场景判断,这个容量已经跟不上应用的运行需求。可以先尝试调大堆内存上限:
修改JAVA_OPTS为:
JAVA_OPTS=-Xms2G -Xmx4G -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=2096M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/jboss/heapdump.hprof
-Xms2G:把堆初始大小设为2G,避免JVM频繁调整堆大小消耗资源-Xmx4G:将堆最大容量提升到4G,具体数值可以根据服务器实际内存调整(建议给系统和其他进程预留1-2G内存)-XX:+HeapDumpOnOutOfMemoryError:触发OOM时自动生成堆转储文件,方便后续排查内存泄漏-XX:HeapDumpPath:指定堆转储文件的保存路径,确保该目录有写入权限
二、排查是否存在内存泄漏
如果调大堆内存后仍然出现OOM,说明应用大概率存在内存泄漏问题,需要进一步深挖:
- 用MAT(Memory Analyzer Tool)或者jvisualvm工具打开上面生成的堆转储文件,分析哪些对象占用了大量堆内存
- 结合错误堆栈来看,溢出发生在
StringBuffer.append和异常堆栈打印环节,重点检查:- 代码里有没有在高频循环中大量拼接字符串且未及时释放的场景
- 异常处理逻辑中是否存在反复打印嵌套极深的异常链(堆栈里多次出现
Throwable.printEnclosedStackTrace,可能是异常链过长导致生成超大字符串) - 日志框架是否配置了输出超大对象的toString内容,导致内存占用过高
三、优化应用代码
针对堆栈指向的字符串操作场景,可以做这些优化:
- 避免在高频循环中用
StringBuffer进行大量拼接,若必须拼接可以考虑分段处理或者用更高效的字符流方式 - 异常处理时,避免无限制打印完整的异常嵌套堆栈(比如只打印前几层关键堆栈信息)
- 检查是否有大对象(比如超大集合、长字符串)被长期持有无法回收
附你提供的错误堆栈信息:
java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3332) [rt.jar:1.8.0_231] at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124) [rt.jar:1.8.0_231] at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448) [rt.jar:1.8.0_231] at java.lang.StringBuffer.append(StringBuffer.java:270) [rt.jar:1.8.0_231] at java.io.StringWriter.write(StringWriter.java:112) [rt.jar:1.8.0_231] at java.io.PrintWriter.write(PrintWriter.java:456) [rt.jar:1.8.0_231] at java.io.PrintWriter.write(PrintWriter.java:473) [rt.jar:1.8.0_231] at java.io.PrintWriter.print(PrintWriter.java:603) [rt.jar:1.8.0_231] at java.io.PrintWriter.println(PrintWriter.java:756) [rt.jar:1.8.0_231] at java.lang.Throwable$WrappedPrintWriter.println(Throwable.java:765) [rt.jar:1.8.0_231] at java.lang.Throwable.printEnclosedStackTrace(Throwable.java:698) [rt.jar:1.8.0_231] at java.lang.Throwable.printEnclosedStackTrace(Throwable.java:710) [rt.jar:1.8.0_231]
内容的提问来源于stack exchange,提问作者Rajeev Ranjan
相关产品推荐
相关产品推荐

