文章目录

  • 前言
  • 使用步骤
    • 1.导入文件
    • 2.读取数据
    • 3.分析数据
  • 总结

前言

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

为什么要有GC? 首先JAVA和ASP.NET都有GC 垃圾回收一个跟踪过程,它传递性地跟踪指向当前使用的对象的所有指针,以便找到可以引用的所有对象,然后重新使用在此跟踪过程中未找到的任何堆内存。公共语言运行库垃圾回收器还压缩使用中的内存,以缩小堆所需要的工作空间,因为你没有足够多的内存,并且,你挺懒,不去自己清理内存,所以就有了 GC 什么是GC GC的全称是garbage collection,中文名称垃圾回收,是.net中对内存管理的一种功能。垃圾回收器跟踪并回收托管内存中分配的对象,定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,GC会自动进行。 在进行垃圾回收时,垃圾回收器回首先搜索内存中的托管对象,然后从托管代码中搜索被引用的对象并标记为有效,接着释放没有被标记为有效的对象并收回内存,最后整理内存将有效对象挪动到一起,这就是GC的四个步骤。 由上可见,GC是很影响性能的,所以一般说来这种事情况还是尽量少发生为好。 为了减少一些性能影响,.net的GC支持对象老化,或者说分代的概念,代是对象在内存中相对存现时期的度量单位,对象的代数或存现时期说明对象所属的代。目前.net的垃圾回收器支持三代。每进行一次GC,没有被回收的对象就自动提升一代。较近创建的对象属于较新的代,比在应用程序生命周期中较早创建的对象的代数低,最近代中的对象位于零代中。


使用步骤

1.导入文件


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

2.读取数据

3.分析数据


根据上述问题所在比例进行分析,占比越大说明使用内存越多,需要重点排查

根据日志信息找点自己的业务代码,重点排查业务逻辑

找到占用内存多的实体类对象进行分析

找到占用内存多的数据库查询语句进行分析


总结

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

【Jvm内存】EclipseMemoryAnalyzer分析内存相关推荐

  1. Java调优之jvm和线程的内存分析

    2019独角兽企业重金招聘Python工程师标准>>> [本文地址] 本文永久地址是:http://www.mzone.cc/article/321.html 这几天因为自己开发的一 ...

  2. java直接内存为什么快_直接内存与 JVM 源码分析

    直接内存(堆外内存) 直接内存有一种叫法,堆外内存. 直接内存(堆外内存)指的是 Java 应用程序通过直接方式从操作系统中申请的内存.这个差别与之前的堆.栈.方法区,那些内存都是经过了虚拟化.所以严 ...

  3. Linux与JVM的内存关系分析

    Linux与JVM的内存关系分析 原文出处: 美团技术团队 引言 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 ...

  4. JVM 调优实战--jmap的使用以及内存溢出分析

    目录 jmap的使用以及内存溢出分析 查看内存使用情况 查看内存中对象数量及大小 将内存使用情况dump到文件中 通过jhat对dump文件进行分析 通过MAT工具对dump文件进行分析 MAT介绍 ...

  5. JVM【带着问题去学习 01】什么是JVM+内存结构+堆内存+堆内存参数(逃逸分析)

    1.是什么 (1) 基本概念:可运行 Java 代码的非真实计算机 ,包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回器,堆和一个存储方法域.它运行在操作系统之上,与硬件没有直接的交互. (2) ...

  6. JVM内存管理概述与android内存泄露分析

    一.内存划分 将内存划分为六大部分,分别是PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量池以及本地方法栈. 1.PC寄存器(线程独有):全称是程序计数寄存器,它记载着每一个线程当前运行的 ...

  7. JVM内存溢出分析-实战JVM(二)

    为什么80%的码农都做不了架构师?>>>    JVM规范规定,除了程序计数器,虚拟机其他内存区域均会发生内存溢出的可能,OutOfMemoryError(OOM) 原文地址:htt ...

  8. 如何使用MAT进行JVM内存泄露分析

    转载自  如何使用MAT进行JVM内存泄露分析 在<Java Agent的隔离实现以及卸载时一些坑>中,卸载Agent之后,使用 jmap-histo:live pid命令验证执行FGC, ...

  9. JVM运行参数_JVM内存模型_常用内存分析工具

    JVM运行参数 常见标准参数 -showversion: 显示当前JVM版本等信息 -D设置系统属性参数: /*** 测试* @author regotto*/ public class JvmTes ...

最新文章

  1. PyTorch代码调试利器_TorchSnooper
  2. electron 打包把node代理服务打包进去_用 Node.js 官方镜像打包一个 express 服务
  3. Android应用开发:网络编程-1
  4. 【Android基础】Fragment 详解之Fragment介绍
  5. php之简单使用数据库
  6. codevs1014 装箱问题
  7. php有哪些开源社区,PHP开源社区
  8. ruby中的特殊字符
  9. java序列化kr_序列化专用列表
  10. 若依如何修改超级管理员登录密码?
  11. functional correspondence by matrix completion
  12. 如何用简单易懂的例子解释隐马尔可夫模型?(入门篇)
  13. 局部内部类使用局部变量应注意什么?
  14. ActiveXObject ADODB.Stream封装
  15. mysql5.7手册官方下载_MySQL官方手册5.7 PDF 下载
  16. 窗体程序计算一元二次方程
  17. win7/win10 密码忘了?没关系,利用5次shift,9步轻松破解密码
  18. matlab里面的取整函数
  19. 日语基础学习 Day 07
  20. git reset 怎么还原_git reset后如何恢复

热门文章

  1. python实验---猜谜语闯关游戏
  2. Linux之压缩和链接
  3. 【愚公系列】2022年09月 微信小程序-Page页面扩展
  4. 生存战争-基础二进制电路板视频学习记录
  5. L1-3 谁能进图书馆 (10 分)
  6. 保研复习(1)——数据库
  7. 装载“90万亿元”后 中国经济巨轮怎么走?
  8. 智能末端试水装置生产厂家物联网数据分析
  9. 战地1服务器列表显示实际ping,《战地1》如何在游戏中随时查看网络质量 怎么调处网络效能表...
  10. php页面 背景不动,页面滚动背景图片不动的原理及实现