`
wensong
  • 浏览: 128220 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Memory Analyzer Tool 使用手记

阅读更多

       最近一段时间一直在研究热部署,热部署中涉及到一个比较头痛的问题就是查内存泄露(Memory Leak),于是乎在研究热部署的过程中,干的最多的一件事就是查内存泄露。
       查内存泄露,最开始尝试用JDK自身的工具去解决这件事,通过jstat和jmap,去发现是否有内存泄露,当判断有内存泄露存在时,试图要去寻找内存泄露的点时,发现单纯使用JDK自身提供的工具没有什么很好的办法,我尝试过Jhat,发现查起来太困难了,后来对比网上推荐的工具,我选择了MAT(Memory Analyzer Tool)。
       MAT是一个eclipse的插件,上手起来比较快。它能够快速的分析dump文件,可以直观的看到各个对象在内存占用的量大小,以及类实例的数量,对象之间的引用关系,找出对象的GC Roots相关的信息,此外还能生成内存泄露报表,疑似泄露大对象的报表等等。

  • 安装MAT
  • 可以选择eclipse插件的方式安装
    • http://download.eclipse.org/mat/1.3/update-site/
  • 也可以选择单独MAT程序下载安装
    • http://www.eclipse.org/mat/downloads.php
  • 使用MAT查内存溢出
    • 生成dump
  • 生成dump文件,可以直接用 jmap -dump:format=b,file=xxx.bin ${pid}的方式
  • 也可以直接用MAT生成,File-》Acquire Heap Dump -》选择要dump的java进程-》finish就可以了
  • 生成完dump后,可以用MAT打开 dump(如果是MAT dump完后会自动进行解析),File-》Open Heap Dump 对dump文件进行解析,最终生成一个Overview视图,这个图是一个概要图,显示了一些统计信息,包括整个size大小,class数量,以及对象 的数量,同时还将生成一个大对象的top图,并线显示大对象占用内存的百分比。
    • 类似:size:2.2MB Classes:3.3k Objects:50.1k ClassLoader:84 Unreachable Objects Histogram
    • 找出溢出源
      • Histogram视图(截图里柱子那个,边上的是Dominator Tree ):列出每個class产生了多少個实例,以及占有多大内存,所占百分比
        • 可以很容易找出站内存最多的几个类,根据Retained Heap排序,找出前几个。
        • 可以分不同的维度来查看类的Histogram视图,Group by class、Group by superclass、Group by class  loader、Group by package
        • 只要有溢出,时间久了,溢出类的实例数量或者其占有的内存会越来越多,排名也就越来越前,通过多次对比不同时间点下的Histogram图对比就能很容易把溢出类找出来。


        •  
          • Dominator Tree(支配树):列出每个对象(Object instance)与其引用关系的树状结构,还包含了占有多大内存,所占百分比
  • 可以很容易的找出占用内存最多的几个对象,根据Percentage(百分比)来排序。
  • 可以分不同维度来查看对象的Dominator Tree视图,Group by class、Group by class  loader、Group by package
  • 和Histogram类似,时间久了,通过多次对比也可以把溢出对象找出来,Dominator Tree和Histogram的区别是站的角度不一样,Histogram是站在类的角度上去看,Dominator Tree是站的对象实例的角度上看,Dominator Tree可以更方便的看出其引用关系。


  •  
    • 定位溢出的原因
      • 通过Path to GC Roots或者Merge Shortest Paths to GC Roots


      •  
  • 通 过Histogram视图或者Dominator Tree视图,找到疑似溢出的对象或者类后,选择Path to GC Roots或者Merge Shortest Paths to GC Roots,这里有很多过滤选项,一般来讲可以选择exclude all plantom/weak/soft etc. references。这样就排除了虚引用、弱引用、以及软引用,剩下的就是强引用。从GC上说,除了强引用外,其他的引用在JVM需要的情况下是都可以 被GC掉的,如果一个对象始终无法被GC,就是因为强引用的存在,从而导致在GC的过程中一直得不到回收,因此就内存溢出了。
  • 接下来就需要直接定位具体的代码,看看如何释放这些不该存在的对象,比如是否被cache住了,还是其他什么原因。
  • 找到原因,清理干净后,再对照之前的操作,看看对象是否还再持续增长,如果不在,那就说明这个溢出点被成功的堵住了。
  • 最后用jstat跟踪一段时间,看看Old和Perm区的内存是否最终稳定在一个范围内,如果长时间稳定在一个范围,那溢出的问题就解决了,如果还再继续增长,那继续用上述方法,看看是否存在其他代码的溢出点,继续找出,将其堵住。


  •  

     
      • 此外通过list objects或show objects by class也可以达到类似的效果,不过没看GC Roots的方式直观,这里就不细说了。
        • list objects -- with outgoing references : 查看这个对象持有的外部对象引用。
        • list objects -- with incoming references : 查看这个对象被哪些外部对象引用。
        • show objects by class  --  with outgoing references :查看这个对象类型持有的外部对象引用
        • show objects by class  --  with incoming references :查看这个对象类型被哪些外部对象引用   
  • 描述: MAT dump
  • 大小: 67.5 KB
  • 描述: MAT Overview
  • 大小: 84.8 KB
  • 描述: MAT 视图选择
  • 大小: 25.7 KB
  • 描述: Histogram视图
  • 大小: 188.5 KB
  • 描述: Dominator Tree(支配树)
  • 大小: 230.4 KB
  • 描述: MAT Path to GC Roots
  • 大小: 187.6 KB
  • 描述: Path to GC Roots (exclude all plantom/weak/soft etc. references)
  • 大小: 53.6 KB
2
0
分享到:
评论
1 楼 demoxshiroki 2015-03-17  
通俗易懂,简单实用

相关推荐

    独立版mat(Memory Analyzer Tool )mac

    Memory Analyzer Tool,简称MAT,是Oracle公司开发的一款强大的Java内存分析工具,专用于诊断和优化Java应用的内存使用情况。MAT独立版为Mac用户提供了在操作系统环境下独立运行的版本,方便开发者对Mac平台上的Java...

    MAT(Memory Analyzer Tool)内存分析工具的安装与使用

    MAT是分析Java堆内存的一个工具,全称是 The Eclipse Memory Analyzer Tool,用来帮助分析内存泄漏和减少内存消耗。使用MAT分析Java堆快照,可以快速计算出对象的保留大小(Retained Sizes),查找到阻止对象被回收...

    使用Memory Analyzer tool

    ### 使用Memory Analyzer Tool (MAT) 分析内存泄漏 #### 前言 在日常工作中,开发者时常会遭遇 `OutOfMemoryError`(内存溢出错误)。此类错误通常表明应用程序出现了重大问题,甚至可能导致系统崩溃。因此,准确地...

    Memory Analyzer tool(MAT) 独立工具

    内存分析是Java应用程序性能优化的关键环节,而Memory Analyzer Tool (MAT) 是IBM开发的一款强大的内存分析工具,专门用于诊断Java应用程序中的内存泄漏和性能问题。MAT不仅提供了详细的内存使用报告,还能帮助...

    MemoryAnalyzer 使用中文

    为了有效地检测和解决这些问题,Eclipse Memory Analyzer Tool(简称MemoryAnalyzer,MAT)应运而生。这款强大的分析工具提供了详细的内存分析功能,帮助开发者诊断和修复内存问题,提升应用性能。 MemoryAnalyzer...

    MemoryAnalyzer For Mac

    MemoryAnalyzer For Mac 百度网盘 解压后是mat.app。 类似执行以下命令:(注意换成自己的地址) /pllhome/software/Linux/mat.app/Contents/MacOS/MemoryAnalyzer -data ./workspace

    MAT(Memory Analyzer Tool)

    MAT(Memory Analyzer Tool)工具是eclipse的一个插件,使用起来非常方便,尤其是在分析大内存的dump文件时,可以非常直观的看到各个对象在堆空间中所占用的内存大小、类实例数量、对象引用关系、利用OQL对象查询,...

    Eclipse Memory Analyzer (Mac版)

    Eclipse Memory Analyzer(MAT,全称Memory Analyzer Tool)是一款强大的Java内存分析工具,尤其在Mac平台上,它提供了独立于Eclipse环境的版本,方便开发者直接使用。MAT的主要目标是帮助开发者诊断和解决Java应用...

    MAT-Memory Analyzer Tool Java内存泄漏分析工具1.5

    MAT 是一个开源的java内存分析工具,能够快速的分析dump文件,可以直观的看到各个对象在内存占用的量大小,以及类实例的数量,对象之间的引用关系,找出对象...适用于 java学习者,程序开发者调试java程序,分析BUG使用

    Eclipse Memory Analyzer中文使用说明(带书签)

    4. Leak Suspects 报表Memory Analyzer 自动分析 Heap Dump 后,会生成一份 Leak Suspects 报表。这份报表列出了可能导致内存泄漏的可疑对象集合,包括他们的 retained heap 大小、描述和可能的原因。Leak Suspects ...

    MemoryAnalyzer 工具包

    包括win、mac、linux版本

    eclipse MAT(Memory Analyzer Tool)

    MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存...

    Eclipse--Memory-Analyzer中文教程

    Memory Analyzer可以单独使用,也可以作为Eclipse的插件使用。 内存分析的基本概念包括Heap Dump(堆转储文件),它是Java进程在运行时的一个内存快照,包含了类信息、对象信息以及线程状态信息等。Heap Dump可以...

    java堆内存分析工具EclipseMemoryAnalyzer

    1、MemoryAnalyzer使用说明文档/使用指南 2、MemoryAnalyzer 1.8.1下载: Eclipse Memory Analyzer 是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减 少内存占用。 使用 Memory Analyzer 来...

    Eclipse Memory Analyzer1.11 (JDK8)

    Eclipse Memory Analyzer1.11 官方下载,适用于JDK8。 加压后直接点击MemoryAnalyzer.exe,不用安装。

    MemoryAnalyzer(JDK8)-1.11.0.20201202-win32.win32.x86_64.zip

    Memory Analyzer Tool(MAT)工具是 eclipse 的一个插件(MAT 也可以单独使用),它分析大内存的 dump 文件时,可以非常直观的看到各个对象在堆空间中所占用的内存大小、类实例数量、对象引用关系、利用 OQL 对象查询,...

    MemoryAnalyzer64位下载.rar

    MemoryAnalyzer主要用于分析jvm运行过程中导致内存溢出、内存泄漏的工具,MemoryAnalyzer主要用于分析jvm运行过程中导致内存溢出、内存泄漏的工具,MemoryAnalyzer主要用于分析jvm运行过程中导致内存溢出、内存泄漏...

    MemoryAnalyzer-1.11.0.20201202-win32.win32.x86-64.zip

    资源名称:Eclipse MemoryAnalyzer,MAT(Memory Analyzer Tool) 文件名称:MemoryAnalyzer-1.11.0.20201202-win32.win32.x86_64.zip 描述: Eclipse Memory Analyzer是一个快速而功能丰富的Java堆分析器,可帮助您...

    MemoryAnalyzer-1.12.0.20210602-win32.win32.x86-64.zip

    资源名称:Eclipse MemoryAnalyzer,MAT(Memory Analyzer Tool) 文件名称:MemoryAnalyzer-1.12.0.20210602-win32.win32.x86_64.zip 描述: Eclipse Memory Analyzer是一个快速而功能丰富的Java堆分析器,可帮助您...

Global site tag (gtag.js) - Google Analytics