频繁gc是什么意思_[JVM]一次线上频繁GC的问题解决
起因:周末测试发现线上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的问题解决相关推荐
- 频繁gc是什么意思_一次性搞清楚线上CPU100%,频繁FullGC排查套路
原标题:一次性搞清楚线上CPU100%,频繁FullGC排查套路 " 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及 Full GC 次数过多的问题. 当然,这些 ...
- 线上频繁发生Full GC 如何调优?如何快速定位OOM、cpu飙升、线程死锁等问题
文章目录 1. jvm调优命令.工具介绍 ①:jps ②:jmap 查看应用中各实例生成情况 快速定位内存突然飙升导致的OOM异常 查看堆内存使用情况 ③:Jstack 检测线程死锁 快速定位导致cp ...
- 通过btrace排查线上频繁Full GC的case
概述 又是一次因为线上报警机制开启的排查问题之旅.某日,钉钉机器人疯狂报警: 接着就是申请机器权限去排查问题,既然是频繁Full GC,那我们排查问题的思路就应该是找到引起Full GC的原因.引起频 ...
- 通过btrace排查线上频繁Full GC的case 1
概述 又是一次因为线上报警机制开启的排查问题之旅.某日,钉钉机器人疯狂报警: 接着就是申请机器权限去排查问题,既然是频繁Full GC,那我们排查问题的思路就应该是找到引起Full GC的原因.引起频 ...
- 频繁项目集java实现_关联分析(2):Apriori产生频繁项集
在关联分析(1):概念及应用中,我们介绍了关联分析的应用场景.基本概念和规则产生思路.在本次的文章中,我们将介绍Apriori算法频繁项集产生的原理.文章中会涉及专有名词,不清楚概念的可在上一篇文章中 ...
- 双12压测引出的线上Full GC排查
这个Full GC问题是去年双12压测的时候触发的,中间排查的过程和踩的坑给大家借鉴一下. 线上问题 双12之前压测的时候起了很小的量,直接触发了Full GC,吓尿了,因为马上双12大促预热就要开始 ...
- 【深入理解JVM】JAVA线上故障排查全套路
线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也是不囿于一个方面的问题的,基 ...
- 记一次排查线上full gc过程
序 最近频繁收到线上报警,就看看到底啥原因 二 导出dump文件 2.1 查找报警对应的进程 ps -ef|grep XX 是23898,看一下gc情况: 这才不到半小时,fgc就增加了好几次. jm ...
- 线上频繁GC怎么处理
1.故障突发 频繁GC会导致接口变慢,系统明显卡顿.首先当然是以最快的速度恢复系统的正常使用,然后组织相关干系人进行快速决策会议,进行事故原因排查,定位问题的根本原因. 2.故障恢复 1.先查看是否是 ...
最新文章
- 你说,一个Java字符串到底有多少个字符?
- Security issue about static code checking
- python字符串创建_在Python上创建完整的字符串
- Codeforces Round #726 (Div. 2) D. Deleting Divisors 博弈
- linux 安装wdcp控制面板
- 如何建立一个完整的游戏AI
- CSS3 Flex 弹性布局用法详解
- HDU 4336 Card Collector(状压 + 概率DP 期望)题解
- 如何使用Java逐行读取大文本文件?
- ffmpeg (三):ffmpeg结合SDL2.0解码音频流
- Android之登录那点事
- 设计模式 ( 十三 ) JDK动态代理模式
- vlfeat各种版本下载链接:
- PyS60 console中文乱码问题
- win10 Administrator账户被禁用怎么办?
- plt.pcolormesh()中遇到TypeError:Dimensions of C (..., xxx) are incompatible with X (...) and/or Y (xxx)
- 360极速浏览器取消默认迅雷下载的正确方法
- 计算机视觉 - 图像编码
- 数据结构-链表-环形链表
- 18_一文总结Flask语法
热门文章
- java 给图片添加暗水印_java 实现给图片添加水印
- python中形参可以使用中文定义嘛_python中函数的参数分类
- Mac使用工具tree,打印项目目录树到Markdown
- pytorch以特征图的输入方式训练LSTM模型
- aotuwried是java的注解吗_@autowire注入为null
- java工商银行项目_ChaosBlade 在工商银行混沌工程体系中的应用实践
- WEB服务器技术名词
- 《C++ Primer》关于自增自减操作符的描述错误
- windows api 每日一练(5)基本内存操作
- 【转】Rhythm Of The Rain 雨的旋律