Java在Ubuntu出现内存溢出的处理步骤
一 快速判断与应急
二 常见类型与对应处置
| 异常类型 | 典型原因 | 快速处置 |
|---|---|---|
| Java heap space | 对象申请过多、内存泄漏、大对象分配 | 增大堆(如**-Xmx2g**)、排查泄漏(堆转储分析)、优化批量/缓存策略 |
| Metaspace / PermGen | 类加载过多、动态生成类 | 增大元空间(如**-XX:MaxMetaspaceSize=…**)、清理无用类加载器 |
| unable to create new native thread | 线程数过多、系统/容器限制 | 降低线程数、优化线程池、提升系统/容器资源限制 |
| Direct buffer memory | ByteBuffer.allocateDirect 未及时释放、堆外缓存过大 | 释放不再使用的直接内存、限制堆外占用(如**-XX:MaxDirectMemorySize**) |
| GC overhead limit exceeded | 老年代被占满、回收效率低 | 调整GC策略(如启用G1 GC)、增大堆、优化对象生命周期 |
| Requested array size exceeds VM limit | 申请超大数组 | 改为分片/流式处理,避免一次性大对象 |
| Map failed / errno=12 | 系统内存不足或 vm.max_map_count 过低(常见于Elasticsearch等本地内存映射场景) | 释放系统内存、提升容器/系统内存、调高 vm.max_map_count(如:sudo sysctl -w vm.max_map_count=262144) |
| 以上处置需结合日志与监控验证效果,避免仅通过加内存掩盖问题。 |
三 定位与修复的实操流程
四 Ubuntu与容器场景的注意事项
五 可直接使用的启动示例