内存溢出(OutOfMemoryError,简称OOM)是服务器启动或运行时常见的严重问题,可能导致服务崩溃、响应延迟或数据丢失,以下从问题定位、原因分析、解决方案及预防措施等维度,为您提供系统化的排查与修复指南。
java.lang.OutOfMemoryError
或类似错误提示。top
、jconsole
)发现内存占用率持续攀高至100%。catalina.out
)、JVM错误日志(hs_err_pid.log
)。示例命令:
grep "OutOfMemoryError" /var/log/tomcat/catalina.out
jmap
导出内存快照。 jmap -dump:format=b,file=heapdump.hprof <PID>
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump
原因分类 | 具体场景 | 解决方案 |
---|---|---|
堆内存不足 | 应用负载激增、缓存未限制大小 | 调整JVM堆参数(-Xmx、-Xms),优化代码逻辑(如分页查询、缓存淘汰策略) |
元空间溢出 | 动态生成类过多(如反射、CGLib代理) | 增加元空间大小(-XX:MetaspaceSize),检查类加载器泄漏 |
直接内存泄漏 | Netty等NIO框架未释放堆外内存 | 排查ByteBuffer.allocateDirect 使用,限制-XX:MaxDirectMemorySize |
线程溢出 | 高并发下线程池配置不合理 | 限制线程池大小,避免无界队列(如使用ThreadPoolExecutor 自定义参数) |
第三方库缺陷 | 依赖库存在内存泄漏(如旧版本Jackson) | 升级组件版本,替换为稳定库(如Gson) |
容量规划
-Xmx4g -Xms4g -XX:MaxMetaspaceSize=512m
监控与告警
代码规范
WeakHashMap
)。压力测试
使用JMeter或Gatling模拟高并发场景,提前暴露内存问题。
-Xmx
与-XX:MaxRAM
)。引用说明