现象:
只要访问指定的某个url,webserver就会很快死掉,直接原因是,内存消耗太多被oom
分析:
其实,这种问题多半是从数据库中一次查询太多数据所致,更直白说就是sql select查询时没有添加limit限制,基本没必要继续查,开发人员闭眼思考3秒就应该知道是哪条sql导致的了,多余的debug都是浪费时间。
但是,有些开发人员就觉得自己遇到了什么高深的bug似的,不见棺材不掉泪,不到黄河不死心,毕竟就算刻意让他写一个消耗内存的程序,都不见得能写出来,所以,下面就简述一下How to debug。
办法1:
通过sql-sniffer工具(或者mysqldump)抓包,看看请求都触发了哪些sql语句,一般也能看出来了。
办法2:
不断地jstack 该java进程,然后触发url请求,分析最后一次堆栈,通过进程死前的堆栈也能分析出来进程是死在哪里的
1 |
pid=123;i=1;while $(jstack $pid >/tmp/$i.stack);do ((i++)); sleep 1;done |
eg:
办法3:
通过ulimit -c 设置,让进程死时留下一个core文件,然后分析core文件