OOM原因

  1. 一次性申请的太多内存,导致内存不足
    更改申请对象的数量
  2. 内存资源耗尽未释放
    找到未释放的对象进行释放
  3. 本身资源不够
    jmap -heap pid 查看堆内存使用情况

如何通过dump定位

  1. 系统已经OOM挂了,提前设置-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump,可以在OOM时生成dump文件
  2. 系统运行中还未OOM,可以通过jmap -dump:live,format=b,file=heap.hprof pid生成dump文件,然后通过jhat heap.hprof查看
  3. 结合jvisualvm进行调试,查看最多跟业务有关的对象,找到GCRoot,查看线程栈,找到问题代码