还没找到原因,监控里面发现实例的内存使用率每天增加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