内存分析工具-MAT(Memory Analyzer Tool)

首先查看如下代码,main函数中有一个成员变量map,map里被循环放入对象Hanson,hanson持有姓名和age还有friends字段,friends字段为字符串数组,此应用会造成内存增长。

  1. package com.hanson.heap;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5.  
  6. public class App {
  7. public static void main(String[] args) throws InterruptedException {
  8. Map<String,Hanson> map = new HashMap<String,Hanson>();
  9. int counter = 1;
  10. while(true) {
  11. Thread.sleep(1);
  12. Hanson h = new Hanson();
  13. String [] friends = new String[counter];
  14. for (int i = 0; i < friends.length; i++) {
  15. friends[i] = "friends"+i;
  16. }
  17. h.setAge(counter);
  18. h.setName("hanson"+counter);
  19. h.setFriends(friends);
  20. map.put(h.getName(),h);
  21. if(counter%100==0)
  22. System.out.println("put"+counter);
  23. counter++;
  24. }
  25. }
  26. }
  1.  

模拟内存溢出程序

使用参数-Xms200m -Xmx200m –Xmn200m -XX:+HeapDumpOnOutOfMemoryError,指定内存200m并启动应用,并且在内存溢出时dump堆信息。使用jstat –gcutil ${pid} 1000 可以看到内存逐渐增长。

使用jmap -F -dump:format=b,file=${file path} ${pid},导出堆内存快照,并使用MAT工具进行分析。

可以在OverView中看到有一个App对象占用了较大内存,共计150.4MB,并且下方还有许多功能接下来逐一介绍。


名词概念

Shallow Size (对象自身占用的内存大小)

对象自身占用的内存大小,不包括它引用的对象。
针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。
针对数组类型的对象,它的大小是数组元素对象的大小总和。

Retained Size (被GC后Heap上释放的内存大小)

Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C, C就是间接引用)
换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。

上图中,GC Roots直接引用了A和B两个对象。
这里不包括D对象,因为D对象被GC Roots直接引用。
如果GC Roots不引用D对象呢?
A对象的Retained Size=A对象的Shallow Size
B对象的Retained Size=B对象的Shallow Size + C对象的Shallow Size

此时,
B对象的Retained Size=B对象的Shallow Size + C对象的Shallow Size + D对象的Shallow Size

out going(查看对象为什么消耗内存)

可以使用右键àlist objectàwith outgoing references,此类对象持有的其他对象。

可以看到此对象friends字段的字符串数组消耗了很多内存。


in going(查看对象被谁引用)

可以使用右键àlist objectàwith ingoing references,其他对象持有的此类对象。

可以看到Hanson对象都被java.util.HashMap @ 0xfb6d7f78这个HashMap所持有,并且此Map都被主线程所持有。


path to GC root (对象没被释放掉的引用)

到GC root的路径

Merge Shortest path to GC root (对象没被释放掉的引用)

到GC root的最短路径,右键 merge shortest path to gc root -> exclude all phantim/weak/soft etc. references:查看此对象没被释放掉的原因,只保留强引用。

可以看到,此类没被释放是因为java.util.HashMap @ 0xfb6d7f78这个HashMap所持有,此map被主线程所持有,与上面结论一致。


Histogram

堆内所有类的统计信息,包含类的实例数量和占用的空间。如果此处包含了自己的类就需要注意是否此类创建过多。默认的大小单位是 Bytes,可以在 Window – Preferences—Memory Analyzer-- 菜单中设置单位。

可以通过filter搜索出自己的类,可以看到内存中共有2153个Hanson对象,占用了0.05MB内存,个数与输出一致(此处代码我用了取模,整百打印)。


Dominator Tree

列出了堆中最大的对象,并且引用此对象的其他对象。

如上图,可以很清晰的看到最大的对象是main函数的线程,是其中的java.util.HashMap @ 0xfb6d7f78这个map消耗内存,此map被主线程引用。


Top Consumers

按类、对象、包分组,列出最消耗资源的类、对象、包。


Duplicate Classes

对多个类加载器加载的类进行分析。

Leak Suspects

内存泄漏报告和系统概述


Top Components

列出内存用量超过堆总量1%的组件

内存分析工具-MAT(Memory Analyzer Tool)的更多相关文章

  1. Android 内存分析工具 MAT(Memory Analyzer Tool)

    如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...

  2. 内存分析工具MAT(Memory Analyzer Tool)从安装到使用

    一.安装 首先,你得有一个Eclipse(因为MAT是Eclipse的插件) 然后,你要在Eclipse上安装MAT,步骤如下: 1.点击Help,Install New Soft,就出现了以下Ins ...

  3. 【转】Eclipse MAT内存分析工具(Memory Analyzer Tool)

    Eclipse MAT内存分析工具(Memory Analyzer Tool) MAT内存分析工具# MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.可以用于查找 ...

  4. Eclipse MAT内存分析工具(Memory Analyzer Tool)

    MAT内存分析工具 MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.可以用于查找内存泄露以及查看内存消耗情况.MAT是基于Eclipse开发的,是一款免费的性能分 ...

  5. 利用内存分析工具(Memory Analyzer Tool,MAT)分析java项目内存泄露

    转载:http://blog.csdn.net/wanghuiqi2008/article/details/50724676 一.开发环境: 操作系统:ubuntu 14.04 IDE:Eclipse ...

  6. [性能测试]:内存泄漏以及MAT(Memory Analyzer Tool)工具使用分析

    一.今天在查看服务器时候,发现内存使用率直接就到99%了, 二.用ps -uaxw查看一下,每个占用内存较多的进程情况: 三,挑出可疑的进程,生成dump文件: jmap -dump:format=b ...

  7. 使用MAT(Memory Analyzer Tool)工具分析dump文件--转

    原文地址:http://gao-xianglong.iteye.com/blog/2173140?utm_source=tuicool&utm_medium=referral 前言 生产环境中 ...

  8. MAT(Memory Analyzer Tool)工具入门介绍

    1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...

  9. MAT(Memory Analyzer Tool)工具入门介绍(转)

    1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...

随机推荐

  1. 前端之html表单

    html表单 用于搜集不同类型的用户输入 表单由不同类型的标签组成   1.<form>标签 定义整体的表单区域     * action属性 定义表单数据提交地址     * metho ...

  2. post网络请求坑

    微信小程序开发中网络请求必不可少.GET.POST请求是最常用的.GET请求 POST请求的时候有好几个坑.我已经为大家填好了.

  3. 学习WPF——使用Font-Awesome图标字体(一)

    一.运行效果图 二.图标字体文件下载 http://fontawesome.dashgame.com/(这个网址可以下载图标字体文件) http://www.fontawesome.com.cn/(这 ...

  4. Android ------------------ 带边框的圆角矩形

    <?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http:/ ...

  5. setlocale()函数详解——C语言

    setlocale函数 函数原型:char* setlocale (int category, const char* locale); setlocale位于头文件,setlocale() 函数既可 ...

  6. 1.html基础标签:文本+链接+图片

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Java 中的 HttpServletRequest 和 HttpServletResponse 对象

    HttpServletRequest对象详解 javax.servlet.http.HttpServletRequest是SUN制定的Servlet规范,是一个接口.表示请求,“HTTP请求协议”的完 ...

  8. [CocoaPods]pod安装与pod更新

    简介 许多以CocoaPods开头的人似乎认为pod install只在第一次使用CocoaPods设置项目时使用,pod update之后才会使用.但事实并非如此. 本指南的目的是解释何时使用pod ...

  9. OpenStack-Ocata版+CentOS7.6 云平台环境搭建 — 8.仪表盘 Dashboard(horizon)安装配置

    仪表盘Dashboard(horizon)是一个web接口,使得云平台管理员以及用户可以管理不同的Openstack资源以及服务.这个部署示例使用的是 Apache Web 服务器. 节点配置信息说明 ...

  10. Postgresql日志收集

    PG安装完成后默认不会记录日志,必须修改对应的(${PGDATA}/postgresql.conf)配置才可以,这里只介绍常用的日志配置. 1.logging_collector = on/off   ...