内存分析工具-MAT(Memory Analyzer Tool)
内存分析工具-MAT(Memory Analyzer Tool)
首先查看如下代码,main函数中有一个成员变量map,map里被循环放入对象Hanson,hanson持有姓名和age还有friends字段,friends字段为字符串数组,此应用会造成内存增长。
package com.hanson.heap; import java.util.HashMap;
import java.util.Map; public class App {
public static void main(String[] args) throws InterruptedException {
Map<String,Hanson> map = new HashMap<String,Hanson>();
int counter = 1;
while(true) {
Thread.sleep(1);
Hanson h = new Hanson();
String [] friends = new String[counter];
for (int i = 0; i < friends.length; i++) {
friends[i] = "friends"+i;
}
h.setAge(counter);
h.setName("hanson"+counter);
h.setFriends(friends);
map.put(h.getName(),h);
if(counter%100==0)
System.out.println("put"+counter);
counter++;
}
}
}
模拟内存溢出程序
使用参数-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)的更多相关文章
- Android 内存分析工具 MAT(Memory Analyzer Tool)
如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...
- 内存分析工具MAT(Memory Analyzer Tool)从安装到使用
一.安装 首先,你得有一个Eclipse(因为MAT是Eclipse的插件) 然后,你要在Eclipse上安装MAT,步骤如下: 1.点击Help,Install New Soft,就出现了以下Ins ...
- 【转】Eclipse MAT内存分析工具(Memory Analyzer Tool)
Eclipse MAT内存分析工具(Memory Analyzer Tool) MAT内存分析工具# MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.可以用于查找 ...
- Eclipse MAT内存分析工具(Memory Analyzer Tool)
MAT内存分析工具 MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.可以用于查找内存泄露以及查看内存消耗情况.MAT是基于Eclipse开发的,是一款免费的性能分 ...
- 利用内存分析工具(Memory Analyzer Tool,MAT)分析java项目内存泄露
转载:http://blog.csdn.net/wanghuiqi2008/article/details/50724676 一.开发环境: 操作系统:ubuntu 14.04 IDE:Eclipse ...
- [性能测试]:内存泄漏以及MAT(Memory Analyzer Tool)工具使用分析
一.今天在查看服务器时候,发现内存使用率直接就到99%了, 二.用ps -uaxw查看一下,每个占用内存较多的进程情况: 三,挑出可疑的进程,生成dump文件: jmap -dump:format=b ...
- 使用MAT(Memory Analyzer Tool)工具分析dump文件--转
原文地址:http://gao-xianglong.iteye.com/blog/2173140?utm_source=tuicool&utm_medium=referral 前言 生产环境中 ...
- MAT(Memory Analyzer Tool)工具入门介绍
1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...
- MAT(Memory Analyzer Tool)工具入门介绍(转)
1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...
随机推荐
- Eclipse中一些真正常用的快捷键
F2 文件重命名(要使用某个过长的文件名或者不好打的文件名时,直接F2再Ctrl+C非常好用,比如:Validform_v5.3.2_min.js) Ctrl+S 保存当前文件 Ctrl+Shift+ ...
- 9.7 翻译系列:EF数据注解特性之--InverseProperty【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in ...
- javaweb中的乱码问题
0.为什么需要编码,解码, 无论是图片,文档,声音,在网络IO,磁盘io中都是以字节流的方式存在及传递的,但是我们拿到字节流怎么解析呢?这句话就涉及了编码,解码两个过程,从字符数据转化为字节数据就是编 ...
- JavaScript基础-第2章
目标 常用数据类型 基本语法 变量的定义与赋值 数据类型与转换 逻辑控制语句 条件语句 循环语句 函数定义 基本语法 变量 变量名以字母或下划线("_")开头 变量可以包含数字.从 ...
- [Python列表]-索引
Python 列表(List) 前言 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内 ...
- JavaScript中子类调用父类方法的实现
一.前言 最近在项目中,前端框架使用JavaScript面向对象编程,遇到了诸多问题,其中最典型的问题就是子类调用父类(super class)同名方法,也就是如C#中子类中调用父类函数base.** ...
- 机器学习基石笔记:11 Linear Models for Classification
一.二元分类的线性模型 线性分类.线性回归.逻辑回归: 可视化这三个线性模型的代价函数, SQR.SCE的值都是大于等于0/1的. 理论分析上界: 将回归应用于分类: 线性回归后的参数值常用于pla/ ...
- python中的变量和算数运算
先说下变量的作用: 用来保存数据,为什么要保存? 后面要使用. 变量的概念: 变量就是用来存储一些信息,供程序以后调用或者操作修改.变量为标记数据提供了一种描述性的名字,以便我们的程序可以被程序的阅读 ...
- Golang Struct 声明和使用
Golang Struct 声明和使用 Go可以声明自定义的数据类型,组合一个或多个类型,可以包含内置类型和用户自定义的类型,可以像内置类型一样使用struct类型 Struct 声明 具体的语法 t ...
- vue 组件发布记录
好久没做独立的 vue 组件了,最近突然想把一个常用的 vue 组件打成一个 npm 包,方便使用.好久不用,发现已经忘记环境怎么搭建.翻看以前的组件,才慢慢回想起来,中间还出现些错误.在这记录下开发 ...