转载 

一个jar包引发的线上容器fullgc

分类:    323人阅读    IT小君  2023-06-20 12:17
随着业务的不断放量,发现应用在高峰期的时候经常会出现fullgc,频率也不高,在正常情况下都还没啥问题,但是流量上来后,fullgc的时候就会出现一波请求超时的异常,让人很是头疼!!

图片

一开始想到的是,程序绝对不会有问题,于是将JVM的Old区上调,降低发生的频次,但是发现频次是下来了,但是还是会有超时,原本想的是应该不会一直上升,但是结果出人意料,看来其中必有蹊跷,只能耐下心去装一波b了。
通过容器隔离下载dump文件,用idea打开分析,发现内存有个数组占用空间特别大,如下:

图片

深入发现entires实体占用很多,感觉一定有问题,继续点入发现。

图片

图片

发现entires对象里面存了很多CommandLatencyEvent对象,于是紧接着我就去看下这个源码这个对象的产生。

图片

查看代码,发现DefaultCommandLatencyEventPublisher的构造方法,会启动一个定时任务,其执行的周期默认是10分钟。继续向上翻阅,发现中间件在创建RedisClusterClient时候会用到该对象。
查阅资料发现lettuce通过内置eventBus,然后对其命令的执行发布相应的延时事件,client端可以根据需求消费eventBus的数据来获取lettuce的相关指标。过查询资料发现,可以关闭该特性。

图片

关闭后,发现old区经过两天的高峰流量都没有继续fullgc,并且old区的大小也变得很小。至此问题解决。

图片

转载于:https://mp.weixin.qq.com/s/As_p8W37f-yeprYDzF-SMQ

支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者

 工具推荐 更多»