nereuschen / blog

blog
44 stars 11 forks source link

问题排查:一个线上OOM实例的排查过程 #20

Open nereuschen opened 9 years ago

nereuschen commented 9 years ago

一台线上的应用服务器突然不可用,紧急下线该tomcat应用之后,发现已经OOM了,自动生成了oom.hprof文件,通过这个文件可以分析出什么原因导致OOM.

需要在java启动参数中配置-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path

发生了什么问题

究竟是什么原因导致突然OOM呢?下面通过MAT工具简要进行分析

由于hprof文件比较大,所以需要修改MAT的JVM参数,防止MAT分析该文件时自己产生OOM

如何定位问题

1.查看大对象


objects

2.占用大对象的线程


big-objs-thread

3.占用内存空间大的对象


his

4.占用内存空间大的class


classes

5.占用内存空间大的线程


threads

6.通过线程堆栈定位代码


通过分析占用对象最大的dubbo线程的堆栈,可以看这次调用的Request对象中url的path=ProductRemote,methodName=query,所以可以断定是调用了ProductRemot服务的query方法导致OOM的 method

7.为什么query方法导致该问题呢


我们可以看看query这个方法的调用参数arugments,这个参数的值是QueryInput,它使用了一个ArrayList对象,size大小是88;结合业务代码来看,这个方法是要一次性查询88个酒店的相关信息,导致这个dubbo服务的线程在返回时占用了94M+的堆空间

argus

xch900910 commented 3 years ago

图挂了