OOM问题小结
OOM原因
- 一次性申请的太多内存,导致内存不足
更改申请对象的数量 - 内存资源耗尽未释放
找到未释放的对象进行释放 - 本身资源不够
jmap -heap pid
查看堆内存使用情况
如何通过dump定位
- 系统已经OOM挂了,提前设置
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump
,可以在OOM时生成dump文件 - 系统运行中还未OOM,可以通过
jmap -dump:live,format=b,file=heap.hprof pid
生成dump文件,然后通过jhat heap.hprof
查看 - 结合
jvisualvm
进行调试,查看最多跟业务有关的对象,找到GCRoot,查看线程栈,找到问题代码