一、现象:
每天早上业务使用高峰期,出现频繁minorGC,过一段时间后,服务正常。
运行一周左右出现oldGC资源回收效果很小,频繁出现oldGC,重启后内存占用下降。
二、查找过程:
1.查看内存情况
free -m
内存并未超预期,当oldGC报警时,内存都被占用。
2.查看gc回收情况
获取进程号:jps
查看回收情况:jstat -gcutil <进程号> 2000
3.查看堆栈占用情况
jmap -histo:hive <进程号> > jmap.info
三、根据查找过程数据分析:
1.查看jmap.info占用比较高的那些对象,发现:org.springframework.cloud.sleuth.Span 特别多。正常应该每次请求完,就会释放span对象,新生代也不会堆积该对象。
2.查找代码中相关的span代码,发现如下代码
Span tmpSpan = tracer.createSpan(module.getName(), span);
查看源码,每次新建span的时候都会往spanContextHolder里加入一个不会自动关闭的span
Thre