如何定位线上OOM?

本文介绍了Java中内存溢出(OOM)的常见原因,如一次性申请过多内存、内存泄漏和资源不足,以及如何通过系统日志、dump文件、jvisualvm和Arthas工具进行快速定位和问题解决。重点讲解了Arthas在监控、线程分析、代码诊断和实时优化中的应用。

造成OOM的原因

1.一次性申请的太多

更改申请对象数量

2. 内存资源耗尽未释放

找到未释放的对象进行释放

3.本身资源不够

堆内存不足

jmap -heap 查看堆信息

如何快速定位OOM?

1.系统已经OOM了

提前设置OOM后生成一个dump文件(.hprof)
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=
然后用jvisualvm这个工具载入dump文件,选择堆类型
在这里插入图片描述
找到最占资源的对象
在这里插入图片描述
随意点开一个,找到GCROOT
在这里插入图片描述
右键在线程中显示
在这里插入图片描述

2.系统运行中还未OOM

2.1导出dump文件:

jmap -dump:format=b, file=filename.hprof 1660

利用jps可以找到java线程
利用history命令也可以看到对象
jmap -histo:live 24286

2.2.结合jvisualvm进行调试
2.3 利用Arthas
Arthas可以做什么?

1、有没有一个全局JVM运行时监控?CPU,线程,内存,堆栈信息等等
2、CPU飙高,是什么造成的?
3、接口没反应、卡住了,是不是死锁了?
4、CTO说你们这个接口太慢了,要优化一下?如何准确找出耗时的代码
5、我写的代码没有执行,是部署的分支不对,还是我压根没提交?
6、线上有一个低级错误,改起来很简单,能不能在不重启应用的情况下,进行类替换,热部署。

如何使用Arthas

1、运行时监控命令 dashboard
2、全局线程面板````thread 11 3、对代码进行反编译jad thisClass```
4、对方法级别的监控

watch 查看方法的参数、结果、异常
trace 可以查看耗时
stack 查看调用栈

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5.生产上CPU飙高的问题处理
利用thread -n 5这个命令可以查看线上前5的线程

6.死锁问题查看

在这里插入图片描述
利用thread -b 也可以实现

7.时空隧道功能
在这里插入图片描述
查看请求信息
在这里插入图片描述
请求回放,可以重复请求
在这里插入图片描述

小结

1、dashboard + thread 命令,基本可以在几秒钟内一键定位问题,找出消耗 CPU 最多的线程和方法栈;
① dashboard 命令用于整体展示进程所有线程、内存、GC 等情况,分析占用CPU 较多的线程
② 使用thread -n查看最放慢的线程在执行的线程栈,找到执行的方法
2、直接 jad 反编译相关代码,来确认根因
3、如果调用入参不明确的话,可以使用 watch 观察方法入参,并根据方法执行时间来过滤慢请求的入参。
4、由于 monitor、trace、watch 等命令是通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此诊断结束要执行 shutdown 来还原类或方法字节码,然后退出 Arthas。

小技巧:可以安装Arthas的idea插件,可以右键快速生成命令

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

善守的大龙猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值