记一次cpu100%问题排查

值班的时候发现有几台机器一直在报cpu使用率100%,下面是处理过程。

  1. 先去top命令看一下cpu的使用率,发现是java应用使用率最高。
  2. 去看下jvm的内存使用情况,因为公司有监控系统可以直接查看堆内存使用情况和gc情况(没有监控的可以使用命令查看),发现频繁的full gc,但young gc次数较少,并且每次gc的内存回收效果不好,有一大部分内存无法回收,怀疑是内存泄漏或有大对象存活。记一次cpu100%问题排查
  3. 是用jmap -dump(由于公司有直接dump的工具,但没显示具体执行的命令行 ,没有工具的可以使用:jmap -dump:file=javaDump.hprof,format=b pid)命令下载文件
  4. 将文件转移到本机并解压缩,打开mat工具将dump文件导入。记一次cpu100%问题排查
  5. 点开记一次cpu100%问题排查此功能,会显示堆内存中对象的数量和占用的内存数量。红框中分别表示对象数量,对象内存,和对象被回收后可以回收的内存(详细解释可以看这个博客:Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思?_若鱼的专栏-CSDN博客记一次cpu100%问题排查
  6. 从上图可以看出除了正常的char[]对象和Object对象,SocketChannelimpl对象和下面几个netty的对象异常多,初步怀疑是netty问题。
  7. 点击下面的Dominator Tree 按钮,记一次cpu100%问题排查该视图以实例对象的维度展示当前堆内存中Retained Heap占用最大的对象,以及依赖这些对象存活的对象的树状结构。记一次cpu100%问题排查从上图可以看出第一个对象和第二个对象可能存在无法回收问题。
  8. 在代码中找到第一个对象和第二个对象,结合Historgram结果和DominatorTree结果看在哪个地方可能会存在创建socketChannel对象,并导致不能修改的问题,在大促结束后修改代码。

参考博客:使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇 - Trust_FreeDom - 博客园

 Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思?_若鱼的专栏-CSDN博客

 

 

 

上一篇:优先队列


下一篇:python-堆-heapd