[Java][OOM] OOM分析思路 - Gukie/learning GitHub Wiki
refer
- http://www.infoq.com/cn/news/2015/12/linux-performance(性能分析的一些命令,有一些在mac中么有)
- https://tekkie.flashbit.net/mac-os/free-m-alternative-for-mac-os-x (mac的free命令的使用)
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'