Java8+Tomcat8部署SpringMVC项目出现OutOfMemoryError错误求排查方案
需要核对的配置项清单
1. JVM内存相关配置
对应错误java.lang.OutOfMemoryError: GC overhead limit exceeded,该错误表示JVM连续多次GC仅回收了不足2%的堆内存,优先核对Tomcat启动参数(一般配置在catalina.sh/catalina.bat的CATALINA_OPTS/JAVA_OPTS字段中):
- 堆内存上下限:核对
-Xms(初始堆内存)、-Xmx(最大堆内存)配置值,是否远低于应用运行所需内存,建议将两个参数设为相同值,避免运行时动态调整堆内存的额外开销 - 元空间配置:核对
-XX:MaxMetaspaceSize配置,Java8用元空间替代永久代,若未配置上限会占用系统内存触发频繁GC,建议至少设置为512m - 新生代配置:核对
-Xmn/-XX:NewRatio配置,新生代内存过小会导致频繁 Young GC,拉高整体GC耗时,建议新生代内存占总堆内存的1/3~1/2
2. 垃圾回收相关配置
- 核对是否开启GC日志:建议添加
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:./gc.log参数,方便后续定位是内存配置不足还是应用存在内存泄漏 - 核对
-XX:+UseGCOverheadLimit参数:该参数默认开启,若被手动关闭会隐藏GC超限错误,导致进程持续无响应不退出,不建议关闭
3. Tomcat运行配置
对应日志中大量线程处于WAITING (parking)阻塞状态,核对conf/server.xml中的配置:
- 线程池配置:核对
Executor标签的maxThreads(最大工作线程数)、maxQueueCapacity(任务队列最大长度)参数,默认Tomcat任务队列为无界队列,请求量超过处理上限时会堆积大量任务占用内存,建议设置合理的队列上限 - NIO连接配置:核对
NioEndpoint相关的connectionTimeout(连接超时时间)、acceptCount(等待队列长度)参数,避免无效连接长期占用资源
4. 安全随机数与JDK版本配置
对应日志中SecureRandom抛出的数组越界错误:
- 核对Java8小版本号:Java8 update 191之前的版本存在
sun.security.provider.SecureRandom数组越界的已知BUG,建议升级到Java8最新小版本 - 核对JRE
java.security配置文件中的securerandom.source参数:默认值为/dev/random,Linux环境下熵池不足时会发生阻塞,大量SSL握手请求会导致线程堆积,建议修改为/dev/./urandom降低阻塞概率
内容的提问来源于stack exchange,提问作者Mansal
相关产品推荐
相关产品推荐

