生产内存溢出,通过jprofiler对dump文件进行分析

 

 

选择"Open Snapshot",点击"Open a single Snapshot "加载dump文件.

生产内存溢出,通过jprofiler对dump文件进行分析

若dump文件jProfiler无法识别,则可以直接修改后缀,如:*.hprof,*.jps,*.bin等

生产内存溢出,通过jprofiler对dump文件进行分析

加载dump文件完成,界面如下: 

生产内存溢出,通过jprofiler对dump文件进行分析

作者插入,重点关注"Current Object Set" 和"Thread Dump",即:

1.Current Object Set: 确定相关对象,找到对应的线程.

2.在Thread Dump中查找对应的线程,确定方法调用栈,找到具体的业务操作.

 

言归正传,因内存溢出,更多的关注占内存大小,可以点击"size"排序,对内存占用最多的对象进行分析

生产内存溢出,通过jprofiler对dump文件进行分析

下面以占内存最大对象为例,具体分析

生产内存溢出,通过jprofiler对dump文件进行分析

 

生产内存溢出,通过jprofiler对dump文件进行分析

 

生产内存溢出,通过jprofiler对dump文件进行分析

生产内存溢出,通过jprofiler对dump文件进行分析

生产内存溢出,通过jprofiler对dump文件进行分析

生产内存溢出,通过jprofiler对dump文件进行分析

已经访问到基础类java.lang.Object[],则此时可以点击"Biggest Objects",查看占内存最大对象,即查看刚刚创建的Todo列表,点击单一对象,为相关业务对象具体内容.如果对相关业务熟悉,应该已经知道什么业务的处理对象了.

生产内存溢出,通过jprofiler对dump文件进行分析

点击"show in graph" ,可以通过调用链,可以查找到对应的线程栈.

生产内存溢出,通过jprofiler对dump文件进行分析

调用链截图,如下: 

生产内存溢出,通过jprofiler对dump文件进行分析

 

生产内存溢出,通过jprofiler对dump文件进行分析

具体线程调用栈信息

生产内存溢出,通过jprofiler对dump文件进行分析

 至此,已经找到了相关业务的调用方法,再具体分析相关代码,找出原因,进行优化即可解决内存溢出问题.

简单说明:线上问题,因一次性调用过多数据,其列表对象就是Todo对象(大对象),导致加载到内存太大,GC无法及时处理,导致内存溢出.