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