转载

Java webserver 内存爆炸Debug

现象:

只要访问指定的某个url,webserver就会很快死掉,直接原因是,内存消耗太多被oom

分析:

其实,这种问题多半是从数据库中一次查询太多数据所致,更直白说就是sql select查询时没有添加limit限制,基本没必要继续查,开发人员闭眼思考3秒就应该知道是哪条sql导致的了,多余的debug都是浪费时间。

但是,有些开发人员就觉得自己遇到了什么高深的bug似的,不见棺材不掉泪,不到黄河不死心,毕竟就算刻意让他写一个消耗内存的程序,都不见得能写出来,所以,下面就简述一下How to debug。

办法1:

通过sql-sniffer工具(或者mysqldump)抓包,看看请求都触发了哪些sql语句,一般也能看出来了。

办法2:

不断地jstack 该java进程,然后触发url请求,分析最后一次堆栈,通过进程死前的堆栈也能分析出来进程是死在哪里的

pid=123;i=1;while $(jstack $pid >/tmp/$i.stack);do ((i++)); sleep 1;done

eg:

Java webserver 内存爆炸Debug

办法3:

通过ulimit -c 设置,让进程死时留下一个core文件,然后分析core文件

原文  https://phpor.net/blog/post/9503
正文到此结束
Loading...