高CPU问题排查
Published on: | Views: 88某天,程序无响应
使用docker stats 查看容器发现CPU占用超高
使用top命令查看CPU占用最高的线程, top命令在procps包里,如果没有需要安装一下
apt update
apt install procps
top -H -p 1
结果如下图
发现居然是VM线程占用了97%的CPU
看一眼GC的情况
好家伙,一直在进行FullGC,每次GC后已经完全不释放空间了
把内存导出来看看
jmap -dump:live,format=b,file=logs/oa-gateway.hprof 1
在idea中打开文件
发现HashMap$Node占用了非常多的内存,再看一下它的GC ROOT对象
这是一个ArrayList列表,里面有340465条记录,根据GC ROOT找到相应的代码
List<Map<String, Object>> resultsMap = new ArrayList<>();
ResultSet rs = (ResultSet) cs.executeQuery();
while (rs.next()) {
//...
resultsMap.add(map);
//...
}
return resultsMap;
推测是返回的数据太多了,resultsMap.add(map)在占用了很多内存后,Heap达到最大值,无法继续获取到新的内存,阻塞在这里。
因为达到堆内存限制,所以GC程序不停在跑,进而导致CPU占用过高。
修改一下代码限制查询数量,问题得到解决。