元数据
| id | java-oom-classify | 收录 | 2026-08-30 |
|---|---|---|---|
| 问题域 | 编码代理与终端 | 主题分组 | 构建与部署 |
| 适用工具 | jdk · 外部工具 | ||
症状
Java 服务 OOM:`Java heap space`(大文件/大查询/ZIP 炸弹/-Xmn 失衡)、`Metaspace`(全量 schema 加载)、`StackOverflowError`(递归无出口)、`unable to create new native thread`(线程耗尽)、`GC Overhead limit exceeded`(GC 空转)。
原因
JVM 内存各区域独立耗尽:堆被大对象/大集合填满;Metaspace 被类元数据塞满;线程栈递归过深;本地线程数超系统上限;泄漏对象导致 GC 空转零回收。
解法
1. 先开 `-XX:+HeapDumpOnOutOfMemoryError` + GC 日志;
2. 按报错签名对号入座(见速查表);
3. 大文件流式化/外链、大查询分页+缓存、禁 ZIP 炸弹(大小/嵌套/路径校验)、schema 分块加载、参数校验+递归改循环、有界线程池+日志不阻塞、-Xmn 合理比例、ThreadLocal 用后 remove;
4. MAT/jstack 取证后修,压测验证。
验证证据
- 机制实测(2026-08-30,WSL Ubuntu,OpenJDK 17.0.18):① `-Xmx64m` 无限分配 → `OutOfMemoryError: Java heap space`;② 无限递归 → `StackOverflowError`(栈深 22691);③ ZIP 炸弹(200MB 重复字符压缩成 204KB,膨胀比 >1000x)内存解压 → `Java heap space`(对应案例一机制);④ `-Xmx16m` 慢速泄漏 → 16s 内 31 次 Full GC、14M→14M 零回收(GC 空转机制实测,字面 GC Overhead 签名未稳定复现)。证据:实测复现日志(2026-08-30)。
- 未实测:Metaspace / native thread / 无界线程池 + logback 阻塞场景(无对应业务环境),机制与修法来自原文案例二/四。
来源与证据
素材来源:https://www.cnblogs.com/mylibs/p/19321491/production-accident-vl01
验证证据:Evidence details kept locally (2026-08-30)