应用服务器内存溢出(OutOfMemoryError,简称 OOM)是企业级系统最常见的稳定性问题之一。其本质原因是:** JVM 堆内存(或某些非堆内存区域)中对象持续创建且无法被垃圾回收(GC),最终超过系统分配的上限。**
下面从常见原因、内存区域、典型场景、排查思路四个维度系统说明。
对象已经不再使用,但仍被引用,导致 GC 无法回收。
典型场景
private static Map<String, Object> cache = new HashMap<>();
// 只 put,不 remove → 内存持续增长
-Xms / -Xmx)-Xms512m -Xmx512m # 高并发下极易 OOM
List<User> users = userMapper.selectAll(); // 百万数据
线程本身占用栈内存(非堆),也可能触发
Unable to create new native thread
| 区域 | 溢出表现 |
|---|---|
| 元空间 Metaspace | 动态生成类过多(反射、CGLIB、Groovy) |
| 直接内存 DirectBuffer | NIO、Netty 使用不当 |
| 栈内存 | 无限递归 |
| 错误信息 | 含义 |
|---|---|
| Java heap space | 堆内存不足(最常见) |
| Metaspace | 类元数据过多 |
| GC overhead limit exceeded | GC 频繁但回收极少 |
| Unable to create new native thread | 线程数或系统限制 |
| Direct buffer memory | NIO 直接内存溢出 |
java.lang.OutOfMemoryError: Java heap space
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs/heap.hprof
重点关注:
WeakHashMap / 本地缓存框架(Caffeine、Redis)应用服务器内存溢出,不是“内存不够”,而是“用错了”或“没收回来”。
如果你愿意,可以告诉我:
我可以帮你做针对性分析和给出修改示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。