GC/OOM问题处理思路

  1. 原则
    先止损,再分析。如果是灰度阶段,则直接回滚代码,保留一台留作分析;如果是全量阶段个别机器偶发,则禁用该机器。
  2. 流程
    保护现场(禁用机器)-> 拉取堆转储文件以及通过流量监控判断可能的问题接口 -> 堆转储文件分析(使用MAT或JProfiler等工具)-> 结合代码确认问题 -> 修复代码或调整jvm配置(-XX:+HeapDumpOnOutOfMemoryError)并上线 -> 观测上线后机器指标(gc-time、gc-count、olggen-used-percent)
  3. 问题分类
  • GC问题
    • youngGC频繁
      youngGC的正常频率应该是1分钟10次左右。可以考虑增大年轻代的大小
    • fullGC频繁
      fullGC的正常频率应该是一天一次左右。如果发生,一般是存在问题,和oom的处理思路类似。
  • OOM问题
    • stackOverFlow
      无限递归调用,观察异常堆栈日志定位方法
    • java heap space
      大对象或短时间大量对象,通过分析堆转储文件定位问题类
    • metaspace
      反射、动态代理等导致动态生成大量类元数据(以反射为例,当同一个反射方法被短时间执行16次,jvm会进行优化,生成对应反射接口的实现类的类元数据并存放到metaspace)。这种问题通过堆转储文件不好定位,因为可能动态生成的类元数据虽然多,但占比不大。一般可以从近期代码变更中是否涉及反射、动态代理进行正向排查。
      解决思路一般是增加反射缓存(比如频繁生成Method的场景,就将Method进行缓存,这样只会生成一次对应的类元数据)、开启类卸载(CMS垃圾回收器)等。
    • GC overhead limit exceeded
      俗称"垃圾回收过头",即垃圾回收占用了很多CPU时间片,但是回收的内存又很少。一般是内存泄漏(常见类的静态集合属性、threadLocal未执行remove方法),或堆内存较小导致。
相关推荐
0和1的舞者6 分钟前
Spring AOP详解(一)
java·开发语言·前端·spring·aop·面向切面
Wang15309 分钟前
Java多线程死锁排查
java·计算机网络
小小星球之旅30 分钟前
CompletableFuture学习
java·开发语言·学习
jiayong231 小时前
知识库概念与核心价值01
java·人工智能·spring·知识库
皮皮林5511 小时前
告别 OOM:EasyExcel 百万数据导出最佳实践(附开箱即用增强工具类)
java
Da Da 泓2 小时前
多线程(七)【线程池】
java·开发语言·线程池·多线程
To Be Clean Coder2 小时前
【Spring源码】getBean源码实战(三)
java·mysql·spring
Wokoo72 小时前
开发者AI大模型学习与接入指南
java·人工智能·学习·架构
电摇小人3 小时前
我的“C++之旅”(博客之星主题作文)
java·开发语言
资生算法程序员_畅想家_剑魔3 小时前
Java常见技术分享-23-多线程安全-总结
java·开发语言