一、现象
(死循环)线上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问题
标签:文件,OOM,排除,案例,对象,内存,Arthas,new,死循环 From: https://www.cnblogs.com/yifanSJ/p/17723333.html