0
点赞
收藏
分享

微信扫一扫

【jvm内存】EclipseMemoryAnalyzer分析内存

流计算Alink 2022-03-25 阅读 47
java

文章目录


前言

MemoryAnalyzer使用分析内存GC问题,安装下载地址如下http://www.eclipse.org/mat/downloads.php,选择系统对应版本,否则报错


使用步骤

1.导入文件

导入需要分析dump文件
导入需要分析dump文件,文件格式为 20220308.hprof

2.读取数据

在这里插入图片描述

3.分析数据

在这里插入图片描述
根据上述问题所在比例进行分析,占比越大说明使用内存越多,需要重点排查
在这里插入图片描述
根据日志信息找点自己的业务代码,重点排查业务逻辑
在这里插入图片描述
找到占用内存多的实体类对象进行分析
在这里插入图片描述
找到占用内存多的数据库查询语句进行分析


总结

  1. 该问题发生的现象:系统中使用了多个while(true)无线循环线程去发送数据,线程运行一段时间后所有线程自动断开,且收到内存告警短信。
  2. 问题的初步排查:仔细核对业务逻辑,发现业务逻辑中在无线循环线程中有业务会导致报错,初步判断是报错导致线程中断,但是修改业务逻辑后并没有解决该问题。
  3. 问题的二次排查:无线循环线程中使用了大量内存队列,机器内存有限,当业务系统数量越来越多的消耗系统资源,出现了抢夺资源问题,其中可能有一个无线循环线程中队列争抢不过,导致线程出现异常,导致中断,中断后的无线循环线程无法消费内存队列里的数据,但是内存队列的生产行为还在继续,因此随着时间的积累,内存队列越来越大,导致内存资源越来越小,导致连锁反应,其他无线循环线程全部停止。
  4. 问题的进一步分析:经仔细排查业务处理逻辑,发现在无线循环中,每隔几秒,就会new很多新的对象,也会占用大量内存。
    最后解决方案:while(true)无线循环线程发送业务数据逻辑,修改为定时任务,这样就保证了不会出现内存队列中数据随着时间一直递增状态,导致内存队列越来越大,从而引发由于内存不足而引起的一系列连锁问题。
举报

相关推荐

0 条评论