选择"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无法及时处理,导致内存溢出.

相关文章:

  • 2021-10-31
  • 2022-01-17
  • 2021-08-21
  • 2021-11-26
  • 2021-07-13
  • 2021-10-01
猜你喜欢
  • 2021-10-26
  • 2022-12-23
  • 2021-08-03
  • 2022-01-24
  • 2021-07-15
  • 2022-01-14
  • 2021-10-25
相关资源
相似解决方案