Memory Analyzer 使用

本文介绍MAT内存分析工具的安装及使用方法,详细讲解如何通过MAT定位Java应用中的内存溢出问题,包括生成dump文件、利用Histogram视图和DominatorTree视图找出疑似溢出的对象或类,以及通过路径到GC Roots定位溢出原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载地址http://wensong.iteye.com/blog/1986449


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 :查看这个对象类型被哪些外部对象引用 

<think>好的,我现在需要帮助用户找到关于Memory Analyzer使用教程或者指南。用户提到了几个引用,我需要先看一下这些引用内容,看看有没有相关的信息。 首先,引用[1]提到Eclipse Memory Analyzer(MAT)的使用技巧,包括跟踪内存泄漏和查看系统状态,还有10个技巧的概述,适合Java开发者。这个看起来是Eclipse MAT的教程,应该对用户有帮助。 引用[2]是关于Redis Memory Analyzer的教程,可能和用户要找的Memory Analyzer不同,但用户可能也需要,不过不确定。不过用户主要询问的是Memory Analyzer,可能指的是通用的或者Eclipse的,所以可能需要重点看引用1、3、4。 引用[3]提到Facebook维护的Memory-Analyzer,虽然项目已归档,但仍有参考价值,功能包括内存堆分析和泄漏报告生成。这个工具可能和Eclipse MAT不同,但用户可能也需要知道。 引用[4]是Memory Analyzer Tool的使用教程,包括生成heap dump文件使用MAT打开的步骤。这里提到的MAT可能是指Eclipse MAT,因为步骤里有jmap和jps,这些都是Java工具,和引用1的Eclipse MAT一致。 所以,用户的问题可能主要需要Eclipse MAT的教程,而引用1和4提供了相关信息。引用3提到的Facebook工具可能也是一个选项,但可能不如Eclipse MAT常用。引用2的Redis分析工具可能不相关,但用户可能需要区分。 接下来,我需要整理这些信息,分点给出教程,并引用对应的引用来源。同时,生成相关问题,比如比较不同工具、如何生成heap dump、常见问题等。 需要确保回答结构清晰,分步骤说明,并且正确引用来源。可能还需要指出不同工具的区别,比如Eclipse MAT和Facebook的Memory-Analyzer的区别,避免用户混淆。 另外,用户可能想了解如何安装和使用这些工具,比如引用4中的生成heap dump的步骤,以及引用1中的技巧。需要把这些步骤详细说明,但可能不需要太深入,因为用户需要的是指南或教程的指引。 最后,生成的相关问题需要围绕Memory Analyzer使用、比较、安装、常见问题等,确保覆盖用户可能的后续问题。</think>### Memory Analyzer 使用教程指南 #### 一、Eclipse Memory Analyzer (MAT) 使用教程 1. **生成内存快照(Heap Dump)** - 使用 `jps` 命令查看 Java 进程的 PID: ```bash jps ``` - 使用 `jmap` 生成 Heap Dump 文件(示例 PID 为 1234): ```bash jmap -dump:format=b,live,file=heapdump.bin 1234 ``` 文件保存为 `heapdump.bin`[^4]。 2. **使用 MAT 分析 Heap Dump** - 在 MAT 中打开生成的 `.bin` 文件,工具会自动生成内存泄漏分析报告。 - 查看「Leak Suspects」报告,识别占用内存最多的对象[^1]。 3. **关键功能示例** - **直方图(Histogram)**:按类统计对象数量和内存占用。 - **支配树(Dominator Tree)**:查找内存中占主导地位的对象。 - **路径到 GC Roots(Path to GC Roots)**:分析对象为何未被垃圾回收。 --- #### 二、Facebook Memory-Analyzer(归档项目) 1. **功能特点** - 提供内存堆分析和泄漏嫌疑报告。 - 支持快速生成可视化分析结果(需注意项目已归档,建议优先使用 MAT)[^3]。 --- #### 三、Redis Memory Analyzer (若需分析 Redis 内存) - 通过扫描数据库键值对,统计内存占用分布。 - 支持按数据类型(String/Hash/List 等)分类分析[^2]。 --- ### 工具对比与选择建议 | 工具 | 适用场景 | 特点 | |---------------------|--------------------------|-----------------------------| | **Eclipse MAT** | Java 应用内存泄漏分析 | 功能全面,社区支持活跃[^1][^4] | | **Memory-Analyzer** | 内存堆分析(归档项目) | 轻量但更新停滞[^3] | | **Redis Analyzer** | Redis 数据库内存优化 | 专用于 Redis 数据结构分析[^2] | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值