线上出现oom问题如何排查?

developS / 2023-08-18 / 原文

一.造成oom的原因?

1.一次性申请的数据太多,比如一次性获取的数据放到list过多,可以分页查询等

2.内存未释放,比如使用jdbc大量连接无法释放,线程池拒绝策略未抛出异常,使用submit等待返回结果一直被阻塞,导致对象一直无法被回收,(因为程序无法结束),可以抛出异常,或者使用池化技术解决。

3.本身资源不够

分配的堆内存不足够,jmap-head查看堆信息

二.如何定位?

1.系统已经挂掉如何处理?

提前设置 -xx:+heapDumpOnOutOfMemoryError -XX:HeapDumpPath=

 使用Visual或者Jstack 分析工具倒入 dump日志  找到GCRoot-查看线程栈

 

 定位到写了一个死循环 

2.系统还未挂掉?

同样子导出dump文件,若不导出,更加难以定位 ,步骤同上