[Java][OOM] OOM分析思路 - Gukie/learning GitHub Wiki

refer

OOM发生时,可以通过以下步骤进行分析

1. 通过一下命令,查看系统的负载,IO情况,以及一些消息

  • top,uptime,iostat 都可以查看系统的负载
  • iostat可以查看系统的 IO情况
  • dmesg 可以查看系统消息,比如OOM以及TCP丢包问题

命令类似

iostat -w 3
uptime
top

dmesg的实例:

dmesg | tail
[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[...]
[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB
[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request.  Check SNMP counters.

该命令会输出系统日志的最后10行。示例中的输出,可以看见一次内核的oom kill和一次TCP丢包。这些日志可以帮助排查性能问题。千万不要忘了这一步。

2. 通过 jstat查看 JVM内存的变化情况

jstat -gc* PID interval countTimes

3. 通过 jstack查看 线程栈的情况,这时候可以使用 grep命令配合一起使用,过滤一些需要的数据,比如running,waiting,block的线程信息

jstack -l PID | grep -i -C 10 'WAITING'

4. 最后可以通过jmap将堆信息下载下来,通过MAT工具进行分析