堆内存oom是最常见问题,需优先排查:90%以上oom发生于此;错误日志含“java heap space”即可确认;通过-xms/-xmx配置不当、内存泄漏(静态集合/未关闭资源)、大对象分配等导致;可用jstat观察老年代持续增长及heapdump分析定位。

堆内存。
这是最常见、最优先排查的区域。Java应用中绝大多数对象都在堆里分配,业务逻辑产生的对象、缓存数据、集合容器、大文件读取结果等,都直接占用堆空间。一旦出现 java.lang.OutOfMemoryError: Java heap space,基本可以确定是堆的问题。
为什么优先查堆?
- 90%以上的内存溢出发生在堆;
- 堆大小受
-Xms和-Xmx明确限制,配置不当或代码失控很容易触顶; - 内存泄漏(如静态集合不断add、未关闭的流被对象引用、监听器未反注册)最终都会在堆里积累;
- 大量分页查询未做限制、一次加载全量数据、循环创建新对象等典型写法,直接压满堆。
快速确认是不是堆的问题:
- 看错误日志是否含
Java heap space; - 启动时加
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heap.hprof,OOM后自动生成堆转储; - 用
jstat -gc <pid></pid>观察GC频率和老年代使用率,如果老年代持续上涨且Full GC无效,大概率是泄漏或对象存活过久。
其他区域也要知道,但不优先:
- 方法区(元空间):多见于大量动态代理、反复加载类(如热部署频繁)、反射生成类,报错通常是
OutOfMemoryError: Metaspace; - 栈:一般报
StackOverflowError,多由无限递归或超深调用链引起,不是“溢出”而是“栈帧撑爆”,和堆OOM性质不同; - 直接内存:NIO使用
ByteBuffer.allocateDirect()但没清理,报Direct buffer memory,需配-XX:MaxDirectMemorySize。
堆查清了,再看别的。没查堆就去调元空间或栈参数,容易跑偏。











