按内存区域区分:1)Java heap space——堆 OOM,最常见:内存泄漏(静态集合无限增长、缓存无界、监听器未注销)或数据量真超容量;2)GC overhead limit exceeded——98% 时间花在 GC 上回收不到 2% 内存,堆即将耗尽的先兆;3)Metaspace——类元数据溢出:大量动态生成类(反射、CGLIB 代理、Groovy 脚本、热部署泄漏)、类加载器泄漏;4)Direct buffer memory——堆外直接内存(NIO、Netty)超 -XX:MaxDirectMemorySize,常见于 ByteBuffer 未及时释放;5)unable to create native thread——线程数爆炸,每个线程栈占 OS 内存,触达 ulimit 或内存耗尽;6)Requested array size exceeds VM limit——数组长度超 Integer 上限减头部。

排查套路:堆 OOM 加 -XX:+HeapDumpOnOutOfMemoryError 自动 dump,用 MAT/JProfiler 看支配树(dominator tree)找最大持有者;Metaspace 用 jcmd VM.classloader_stats 看哪个加载器持类过多;直接内存开 NMT(NativeMemoryTracking)或看 Unsafe.allocateMemory 调用方;线程数问题 jstack 数线程名前缀找源头(多半是线程池无界创建)。追问方向:内存泄漏 vs 内存溢出的辨析、容器环境下 JVM 内存感知(UseContainerSupport)与 cgroup 限制、Full GC 频繁但不出 OOM 的调优入口。

(约 470 字)