选择"Open Snapshot",点击"Open a single Snapshot "加载dump文件.
若dump文件jProfiler无法识别,则可以直接修改后缀,如:*.hprof,*.jps,*.bin等
加载dump文件完成,界面如下:
作者插入,重点关注"Current Object Set" 和"Thread Dump",即:
1.Current Object Set: 确定相关对象,找到对应的线程.
2.在Thread Dump中查找对应的线程,确定方法调用栈,找到具体的业务操作.
言归正传,因内存溢出,更多的关注占内存大小,可以点击"size"排序,对内存占用最多的对象进行分析
下面以占内存最大对象为例,具体分析
已经访问到基础类java.lang.Object[],则此时可以点击"Biggest Objects",查看占内存最大对象,即查看刚刚创建的Todo列表,点击单一对象,为相关业务对象具体内容.如果对相关业务熟悉,应该已经知道什么业务的处理对象了.
点击"show in graph" ,可以通过调用链,可以查找到对应的线程栈.
调用链截图,如下:
具体线程调用栈信息
至此,已经找到了相关业务的调用方法,再具体分析相关代码,找出原因,进行优化即可解决内存溢出问题.
简单说明:线上问题,因一次性调用过多数据,其列表对象就是Todo对象(大对象),导致加载到内存太大,GC无法及时处理,导致内存溢出.