典型问题 JVM堆内存溢出

JVM堆内存溢出

典型问题 / 典型问题/宕机/JVM堆内存溢出.md

JVM堆内存溢出

典型现象/特征

  1. 接口超时,功能无响应
  2. pod宕机或重启

排查确认步骤

可按照以下证据链进行确认:

  1. 1.先通过异常接口定位具体异常服务,确认该服务是否宕机或重启;
  2. 2.查看宕机前或重启前的应用日志,检测是否存在 OutOfMemoryError: Java heap space 关键异常信息。
  3. 3.查看服务挂载目录,确认是否生成 heapdump 文件;

如果上面3条信息都符合,可确认为堆内存溢出。

更多判断依据参考如下:

  1. 1.结合服务堆内存监控,确认是否存在堆内存长期高位运行(通常大于 85%)或在异常时段监控突然缺失的情况;
  2. 2.同时检查宕机或重启前是否出现多次 Full GC(如超过 2 次);
  3. 3.接着通过巡检工具或人工检查应用 yaml 中的资源配置,确认java中内存配置和容器的 limitrequest 等参数是否明显偏低或配置不合理,如不合理则需要在后续恢复时调整。

分析工具

  1. 一键采集工具
  2. jvm分析工具 中的内存信息堆内存分析性能分析
  3. 系统监控查看说明 中的内存GC部分
  4. 系统日志查看指引info 日志查看

常见应急恢复策略

text
- 修改对应异常服务的部署模板,做以下调整(调整需参考服务推荐配置和客户使用量等综合分析)
1、确认为堆空间OOM,调整部署模板中java启动参数配置中: -Xms -Xmx ; 一般可再原配置基础上调30%-50%
2、需同步调整部署yaml文件,按照java启动参数的调整,同样增加yaml中资源限制部分:
        resources:
            limits:            
              memory:  #根据java配置中增加适当调整
            requests:
              memory:  #根据java配置中增加适当调整