定位线上OOM(内存溢出)

出现了OutOfMemoryException的异常,可能是什么原因造成的?如何快速定位?

造成OOM原因

1.一次性申请的太多

 更改申请对象数量

比如,在做数据列表的查询,有可能一次将数据库中的数据全部拿出来,如果数据量达到了千万级,所有的数据都放到List中,有可能造成内存溢出。

2.内存资源耗尽没有释放

找到为释放的对象进行释放

比如,使用线程或数据库查询,在高并发的情况下,不断的创建线程,创建jdbc Connection,但是又没有释放,久而久之就会造成内存溢出。

可以引用池化思想,最多只申请固定资源,用到了就阻塞不再申请。

3.本身资源不够

jmap -heap 查看堆信息

扫描二维码关注公众号,回复: 15899752 查看本文章

如何通过dump定位

1.系统已经OOM挂了

在OOM的时候会导出一个堆的dump的文件,导出到指定的文件路径中.(会记录程序运行中所有的对象信息,非常占磁盘空间  )

提前设置

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=路径

 2.系统运行中还未OOM 

导出dump文件:(可以通过Arthas工具进行调试)

jmap -dump:format=b,file=xxx.hprof 进程id

会造成GC的STW

正在运行的程序不会上来就导出dump文件,只有在接收到了频繁的fullgc或者CPU Load飙高的告警,才会去服务器导出dump文件

3.dump文件结合jvisualvm进行条数

查看最多跟业务有关对象-->找到GCRoot-->查看线程栈

猜你喜欢

转载自blog.csdn.net/xzxailh/article/details/128995447