起因:周末测试发现线上mq消息积压了十几万的消息,如下图所示

每个队列几万的消息,立即采取紧急措施,将队列下线重新上线。

处理积压消息的量,调用量起来了,很快消息积压解决了。开始事件复盘。

首先分析是否是消息消费能力跟不上消息产生原因,看入口消息,QPS是29.6

消息消费QPS如下

事后开始分析原因,发现队列积压有如下异常:

超时时间设置的很长,大致分析出消息处理线程等待下游接口超时,连接下游接口设置的超时时间很长,为什么下游接口如此多SocketTimeOut呢?

然后查看具体的超时接口,调用的下游站点发生SocketTimeout

查看下游站点接口的Cat,发现调用时间极不规律,如下图所示

看日常的调用时间如下图所示,都不超过100ms的:

再看部分机器的GC内存回收,惊呆了,因为这个站点有几个月没有重新发过版本,发现GC如下图,压根没有年轻代的事,新申请的对象都需要在老年代申请,所以导致老年代一直回收。

找一台机器,把GC回收dump下来分析,使用mat查看,如下图所示:

一共七百多M空间,一个对象就占了640M空间,找到原因了,继续往下,看这个对象为什么会这么大,从GC Roots最短路径如下,解释下

Shallow Heap指的是对象本身占据的内存大小  Retained Heap = 本身本身占据内存大小 + 当前对象可直接或间接引用到的对象的大小总和,

换句话说,就是当前对象如果被回收,能够回收的内存大小。

继续看,第一步,查看谁引用了这个对象,找到自己代码中的类,

第二步,查看这个对象TaggedMetricRegistry都引用了谁,为什么会占用这么大的内存空间,如下图所示,

找到罪魁祸首了, 现在开始可以看下代码,如下所示:

发现 TaggedMetricRegistry继承自MetricRegistry,如下图

metrics是个Map,MetricRegistry的成员变量,继续回来看mat,看内部内存占用

如下图所示,发现Map的有几个Node节点尤其大,

追下去,继续

看到这个key,对应在代码中的位置,

开始代码分析,这个代码的作用是统计接口每次的执行时间,统计窗口是1分钟,问题就出现在这,因为这个函数的QPS非常高,在update的源码如下:

private final ConcurrentSkipListMap measurements;

@Overridepublic void update(longvalue) {if (count.incrementAndGet() % TRIM_THRESHOLD == 0) {

trim();

}

measurements.put(getTick(), value);

}

private long getTick() {

for (; ; ) {

final long oldTick = lastTick.get();

final long tick = clock.getTick() * COLLISION_BUFFER;

// ensure the tick is strictly incrementing even if there are duplicate ticks

final long newTick = tick > oldTick ? tick : oldTick + 1;

if (lastTick.compareAndSet(oldTick, newTick)) {

return newTick;

}

}

private void trim() {

measurements.headMap(getTick() - window).clear();

}

measurements是一个跳跃表,在1分钟有数据频繁产生的时候,会导致在一个时间窗口(1分钟)measurements极速增长,导致内存快速增长,所以产生频繁Yong GC,把这个Metric统计取消,问题Fixed。

频繁gc是什么意思_[JVM]一次线上频繁GC的问题解决相关推荐

  1. 频繁gc是什么意思_一次性搞清楚线上CPU100%,频繁FullGC排查套路

    原标题:一次性搞清楚线上CPU100%,频繁FullGC排查套路 " 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及 Full GC 次数过多的问题. 当然,这些 ...

  2. 线上频繁发生Full GC 如何调优?如何快速定位OOM、cpu飙升、线程死锁等问题

    文章目录 1. jvm调优命令.工具介绍 ①:jps ②:jmap 查看应用中各实例生成情况 快速定位内存突然飙升导致的OOM异常 查看堆内存使用情况 ③:Jstack 检测线程死锁 快速定位导致cp ...

  3. 通过btrace排查线上频繁Full GC的case

    概述 又是一次因为线上报警机制开启的排查问题之旅.某日,钉钉机器人疯狂报警: 接着就是申请机器权限去排查问题,既然是频繁Full GC,那我们排查问题的思路就应该是找到引起Full GC的原因.引起频 ...

  4. 通过btrace排查线上频繁Full GC的case 1

    概述 又是一次因为线上报警机制开启的排查问题之旅.某日,钉钉机器人疯狂报警: 接着就是申请机器权限去排查问题,既然是频繁Full GC,那我们排查问题的思路就应该是找到引起Full GC的原因.引起频 ...

  5. 频繁项目集java实现_关联分析(2):Apriori产生频繁项集

    在关联分析(1):概念及应用中,我们介绍了关联分析的应用场景.基本概念和规则产生思路.在本次的文章中,我们将介绍Apriori算法频繁项集产生的原理.文章中会涉及专有名词,不清楚概念的可在上一篇文章中 ...

  6. 双12压测引出的线上Full GC排查

    这个Full GC问题是去年双12压测的时候触发的,中间排查的过程和踩的坑给大家借鉴一下. 线上问题 双12之前压测的时候起了很小的量,直接触发了Full GC,吓尿了,因为马上双12大促预热就要开始 ...

  7. 【深入理解JVM】JAVA线上故障排查全套路

    线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也是不囿于一个方面的问题的,基 ...

  8. 记一次排查线上full gc过程

    序 最近频繁收到线上报警,就看看到底啥原因 二 导出dump文件 2.1 查找报警对应的进程 ps -ef|grep XX 是23898,看一下gc情况: 这才不到半小时,fgc就增加了好几次. jm ...

  9. 线上频繁GC怎么处理

    1.故障突发 频繁GC会导致接口变慢,系统明显卡顿.首先当然是以最快的速度恢复系统的正常使用,然后组织相关干系人进行快速决策会议,进行事故原因排查,定位问题的根本原因. 2.故障恢复 1.先查看是否是 ...

最新文章

  1. 你说,一个Java字符串到底有多少个字符?
  2. Security issue about static code checking
  3. python字符串创建_在Python上创建完整的字符串
  4. Codeforces Round #726 (Div. 2) D. Deleting Divisors 博弈
  5. linux 安装wdcp控制面板
  6. 如何建立一个完整的游戏AI
  7. CSS3 Flex 弹性布局用法详解
  8. HDU 4336 Card Collector(状压 + 概率DP 期望)题解
  9. 如何使用Java逐行读取大文本文件?
  10. ffmpeg (三):ffmpeg结合SDL2.0解码音频流
  11. Android之登录那点事
  12. 设计模式 ( 十三 ) JDK动态代理模式
  13. vlfeat各种版本下载链接:
  14. PyS60 console中文乱码问题
  15. win10 Administrator账户被禁用怎么办?
  16. plt.pcolormesh()中遇到TypeError:Dimensions of C (..., xxx) are incompatible with X (...) and/or Y (xxx)
  17. 360极速浏览器取消默认迅雷下载的正确方法
  18. 计算机视觉 - 图像编码
  19. 数据结构-链表-环形链表
  20. 18_一文总结Flask语法

热门文章

  1. java 给图片添加暗水印_java 实现给图片添加水印
  2. python中形参可以使用中文定义嘛_python中函数的参数分类
  3. Mac使用工具tree,打印项目目录树到Markdown
  4. pytorch以特征图的输入方式训练LSTM模型
  5. aotuwried是java的注解吗_@autowire注入为null
  6. java工商银行项目_ChaosBlade 在工商银行混沌工程体系中的应用实践
  7. WEB服务器技术名词
  8. 《C++ Primer》关于自增自减操作符的描述错误
  9. windows api 每日一练(5)基本内存操作
  10. 【转】Rhythm Of The Rain 雨的旋律