OOM发生的一般原因:
- 资源不够
可能是内存分配过小,而正常业务却使用了大量的内存 - 申请的资源太多
某一个对象被频繁的申请,却没有被释放,内存不断泄露,最终导致内存耗尽 - 资源耗尽
某一个资源被频繁的申请,系统在资源耗尽,例如不断的创建线程,不断的发起网络连接
定位方法:
步骤一:确认内存本身分配是不是过小
jmap -heap 进程id
步骤二:找到最耗费内存的对象
jmap -histo:live 进程id | more
步骤三:确认资源是否耗尽
pstree和netstat来查看进程创建的线程数,以及网络连接数等资源是否被耗尽
内存分析简单有效的方法是通过内存的dump命令,导出内存栈,但是这个命令会进行full GC一次,导出的文件可以通过MAT VisualVM查看
如下图显示
showllow heap表示的是对象本身的大小,retained heap表示的是本身的大小加引用的大小
另外如果要定位代码正在做什么事情