出现了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-->查看线程栈