Arthas问题排除案例

发布时间 2023-09-22 21:12:49作者: yifanSJ

一、现象

(死循环)线上CPU100%

(内存无法回收)内存OOM

二、原因:

(死循环)不断的进行加减操作、不断的死循环打印日志、不断的new对象

(内存溢出)不断的大量new对象,但不被回收,也可能不是死循环,但new出的对象无法被回收,导致内存溢出

三、解决过程

1、启动arthas

2、查询cpu占用最高线程

thread

3、发现id为58的线程CPU占用最高,查询其调用链

thread 58

3.1死循环

在这边我们可以发现在SimulateHashMap.getNode方法中卡住了,这时候我们基本就可以确定是因为死循环的问题

3.2 OOM

还有一种可能,不断大量的new对象,导致内存OOM

第一步:检查Full GC的情况

jstat -gc pid 间隔时间 显示次数

jps -l

jstat -gc 97598 3000 30

3.2.1 死循环

 

3.2.2 内存泄露

 

这种如果通过thread来分析,可能不会卡在某个方法上,这时我们需要通过堆文件来分析,通过heapdump生成堆转储文件,用于分析内存问题。

heapdump /path/to/dump.hprof

将hprof文件放到jdk自带的分析工具jvisualvm.exe中,看到堆中有大量之前 JdbcTemplate 对象,同时大量的对象又放在HaspMap中,导致栈结束后,对象无法被回收,导致OOM。

4. 修改原代码

直接修改源java文件(或jad反编译后)再mc编译回.class文件

再通过redefine将.class文件进行热部署

最后再观察cpu问题