问题描述
现象PRE T-node3节点, CPU使用率超过300%。
问题排查步骤
- jstack 快照
进入docker docker exec -it a4696a3180d9 bash
生成线程快照 jstack 1 >jstack20230216_1.log
排查CPU飙升问题步骤:
(1) top
(2) top -Hp [pid]
(3) 获取cpu最高的进程号并转换为16进制<pid_16>
(4) jstack [pid]|grep -A 10 [pid_16]
(5) 查看对应问题的代码
排查发现引起CPU飙升的线程都是GC线程,
- 查看gc日志,如果jvm参数里面加了gc log日志, 用easygc工具简单分析一下
- jmap 生成内存的快照
jmap -dump:live,format=b,file=heapdump20230216.bin 1
- MAT 快照分析
存在一个机器故障数据记录表导出,导致的。根本原因是机端上报的数据量激增,之前约定保留3天的数据量已经超过800w,导致内存空间打满,GC释放不到导致整个程序的卡死。
- arthas
docker exec -it a4696a3180d9 bash -c "java -jar /opt/arthas/arthas-boot.jar" T-node3 节点arthas命令进入
结论
防御性编程,对于数据导出需要预估数据量的大小,一次性全量导出是一个很危险的动作,比如其他系统异常导致数据量激增,然后导出导致内存占满不能释放,占用堆内存老年代空间,gc线程一直回收但是不能释放。