← Back to list

高CPU问题排查

Published on: | Views: 88

某天,程序无响应 使用docker stats 查看容器发现CPU占用超高 image.png

使用top命令查看CPU占用最高的线程, top命令在procps包里,如果没有需要安装一下

apt update 
apt install procps
top -H -p 1

结果如下图 image.png 发现居然是VM线程占用了97%的CPU

看一眼GC的情况 image.png 好家伙,一直在进行FullGC,每次GC后已经完全不释放空间了

把内存导出来看看

jmap -dump:live,format=b,file=logs/oa-gateway.hprof 1

在idea中打开文件 image.png 发现HashMap$Node占用了非常多的内存,再看一下它的GC ROOT对象 image.png 这是一个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占用过高。

修改一下代码限制查询数量,问题得到解决。