工作纪实42-内存泄漏(线上问题大乱斗)

文章描述了作者在监控中发现应用实例内存每天增加5%,经过排查怀疑可能是内存泄漏,但未发现明显错误日志和溢出迹象。作者尝试通过`jmap`和`jstat`检查堆内存和垃圾回收情况,但因业务量大和日志文件庞大,暂时未进行堆转储分析。文章提出项目中CMS垃圾回收期没有设置阈值,引发作者对30%回收率的疑惑,寻求网友帮助。
摘要由CSDN通过智能技术生成

还没找到原因,监控里面发现实例的内存使用率每天增加5%,这两天排查一下,mark一下;

下午看了几个小时,泄漏大概率是乌龙事件了!

为何我有这样的疑惑:
在这里插入图片描述
上线完后面几天内存一直在增加,没有减少,直到今天下午2点,突然下降了一波;
我使用了下面两个命令:

jmap -histo:live 1738 #查看实时的堆内存对象分布信息

最大的对象也就40mb,我看了下机器的配置2核/4g,理论上讲不会造成泄漏或者溢出才对,日志也没有error这种输出;
在这里插入图片描述
又看了下gc的回收情况:

jstat -gcutil 1738 1000

也比较正常,因为主要是一个方法,会有一些对象的创建,执行完就没用了其实,所以年轻代的回收很频繁,也没问题;(没有直接dump下来分析,是因为这台机器是专门处理一个mq消息的,单台qps大概在400左右,做的事情比较简单,但是量比较大,一天8个g的日志文件,dump文件的话会更大,因此就先不考虑用mat区分析堆内存文件),代码我也检查了,几乎不存在泄漏的可能
在这里插入图片描述
分析:
根据最上面的内存监控折线图,可以看到30%左右就回收了一部分内存,因此怀疑是内存使用率太低,前期过的对象一直存放在堆中,达到30%的阀值后触发了回收;后续需要再持续的跟踪观察下才能判断是不是这样;

疑惑的点就是,项目中的jvm启动参数,cms垃圾回收期并没有设置任何内存使用阀值,不知道为何是30%,希望网友们帮帮我!

其他参考:
-Xms 为jvm启动时分配的内存,比如-Xms200m,表示分配200M
-Xmx 为jvm运行过程中分配的最大内存,比如-Xms500m,表示jvm进程最多只能够占用500M内存
-Xss 为jvm启动的每个线程分配的内存大小

jstat命令列含义

时间戳记 -自目标JVM启动时间以来的时间(以秒为单位)。
S0:幸存区0(Survivor 0)的使用率,以百分比表示。
S1:幸存区1(Survivor 1)的使用率,以百分比表示。
E:伊甸园区(Eden)的使用率,以百分比表示。
O:老年代(Old)的使用率,以百分比表示。
M:元数据区(Metaspace)的使用率,以百分比表示。
CCS:压缩类空间(Compressed Class Space)的使用率,以百分比表示。
YGC:年轻代垃圾回收的次数。
YGCT:年轻代垃圾回收的总时间(单位:秒)。
FGC:Full GC(全局垃圾回收)的次数。
FGCT:Full GC的总时间(单位:秒)。
GCT:垃圾回收的总时间(包括年轻代和Full GC的时间)(单位:秒)。

jvm参数参考:https://blog.csdn.net/weixin_44642403/article/details/107449395

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值