线上出现oom问题如何排查?
一.造成oom的原因?
1.一次性申请的数据太多,比如一次性获取的数据放到list过多,可以分页查询等
2.内存未释放,比如使用jdbc大量连接无法释放,线程池拒绝策略未抛出异常,使用submit等待返回结果一直被阻塞,导致对象一直无法被回收,(因为程序无法结束),可以抛出异常,或者使用池化技术解决。
3.本身资源不够
分配的堆内存不足够,jmap-head查看堆信息
二.如何定位?
1.系统已经挂掉如何处理?
提前设置 -xx:+heapDumpOnOutOfMemoryError -XX:HeapDumpPath=
使用Visual或者Jstack 分析工具倒入 dump日志 找到GCRoot-查看线程栈
定位到写了一个死循环
2.系统还未挂掉?
同样子导出dump文件,若不导出,更加难以定位 ,步骤同上