线上CPU100%及应用OOM的排查和解决过程

1.检查服务器资源占用状况 命令top


2.使用命令导出pid进程相关的堆栈信息

打印系统负载快照
top -b -n 2 > /tmp/top.txt
top -H -n 1 -p pid > /tmp/pid_top.txt
 
cpu升序打印进程对应线程列表
ps -mp-o THREAD,tid,time | sort -k2r > /tmp/进程号_threads.txt
 
看tcp连接数 (最好多次采样)
lsof -p 进程号 > /tmp/进程号_lsof.txt
lsof -p 进程号 > /tmp/进程号_lsof2.txt
 
查看线程信息 (最好多次采样)
jstack -l 进程号 > /tmp/进程号_jstack.txt
jstack -l 进程号 > /tmp/进程号_jstack2.txt
jstack -l 进程号 > /tmp/进程号_jstack3.txt
 
查看堆内存占用概况
jmap -heap 进程号 > /tmp/进程号_jmap_heap.txt
 
查看堆中对象的统计信息
jmap -histo 进程号 | head -n 100 > /tmp/进程号_jmap_histo.txt
 
查看GC统计信息
jstat -gcutil 进程号 > /tmp/进程号_jstat_gc.txt
 
生产对堆快照Heap dump
jmap -dump:format=b,file=/tmp/进程号_jmap_dump.hprof 进程号
 
堆的全部数据,生成的文件较大。
jmap -dump:live,format=b,file=/tmp/进程号_live_jmap_dump.hprof 进程号
dump:live,这个参数表示我们需要抓取目前在生命周期内的内存对象,也就是说GC收不走的对象,一般用这个就行。
拿到出现问题的快照数据,然后重启服务。

最后使用 Eclipse Memory Analyzer 工具。
https://projects.eclipse.org/projects/tools.mat/downloads
下载最新的版本需求匹配JDK17或者17以上

如果进程号_live_jmap_dump.hprof文件过大打不开
找到配置文件MemoryAnalyzer.ini 修改内存大小:    
-Xmx4096m

3.导出的堆快照信息可以看到哪里导致的OOM

4.检查代码是map存放数据太多但是内存满了,调整代码逻辑解决问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值