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存放数据太多但是内存满了,调整代码逻辑解决问题