工具篇-MAT(Memory Analyzer Tool)
---
layout: post
title: 工具篇-MAT(Memory Analyzer Tool)
description: 让内存泄漏无所遁形 2015-10-08
category: blog
---
## 让内存泄漏无所遁形##
----------
### 一、android 垃圾回收机制的理解 ###
**1、堆和栈** - 至少我们需要知道,我们写的一句代码,它的所需要的内存是放到哪里的。
至于如何释放堆和栈这些细节,此次略过一万字,请大家自行google.
堆heap:内存数据区;简单来说,保存了对象的实例:对象的属性值;对象从堆申请完内存之后会生成一个地址存在stack里边。heap的释放是有jvm回收器来负责的。
栈stack:内存指令区;简单来说,保存了对象的实例里边的属性类型,方法地址,基本类型,如int,float,常量,静态变量都是存在栈里边的。栈里边内存的释放是FILO(first in ,last out)会自动释放。
简单来说,new 创建的一个对象,大部分内存都是放在heap里的。
native 内存 和 ashmem 是不属于jvm gc范围的;
**2、拉贾回收器**
垃圾收集算法的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。
触发条件:
- 手动调用System.gc(),只是建议触发GC,并不保证每次都能GC
- app空闲时,gc的线程优先级是极低的,此时可能会调用GC
- heap内存申请不足时,会强制触发gc,若GC一次还不够,则会进行第二次GC,若内存还不够,则会引发OOM;
**GC引发的直观问题,频繁的GC会导致app的用户体验:UI卡顿,耗电;**
由GC想起的一些编码细节:
(1)能用int就不要用Integer
(2)大对象不用时最好设置为null
(3)尽量避免产出大量的临时对象
(4)使用StringBuffer代替String拼接字符串,String拼接会产生多个垃圾对象
(5)尽量少使用静态变量,静态变量属于全局变量,不会被GC回收,它们会一直占用内存。
(6)activity切记不要被全局单例类引用。
----------
###二、MAT-Memory Analyzer tool ###
此工具可以帮我们分析出当前使用的app存留在内存里对象有哪些,并能跟踪到具体的引用对象,从而找出内存泄漏的原因。
1、MAT下载地址:[点击进入](http://www.eclipse.org/mat/downloads.php)
2、了解几个参数的含义:
DDMS参数:
a、Heap Size 系统为此进程所分配堆的大小,当资源增加,
当前堆的空余空间不够时,系统会增加堆的大小,
若超过上限 (例如64M,视平台和具体机型而定)则会被杀掉
b、Allocated 堆中已分配的大小,这是应用程序实际占用的内存大小,资源回收后,此项数据会变小
MAT工具参数:
Histogram:列出当前存留对象和数量
Dominator Tree:由大到小列举出对象以及他们含有什么。
Path to GC Root:显示GC路径的path

###二、MAT-Memory Analyzer tool 使用步骤 ###
1、dump内存文件:
使用DDMS的dump工具dump出你所选中进程的文件;
步骤:
1、选择进程,点击update heap;
2、再手机上打开你想要检测的页面
3、狂戳GC直到Allocated的值不再下降为止;
4、再点击一下update heap带有红色向下箭头的按钮,稍等片刻,会自动弹出文件保存框;
5、保存dump文件到本地;


注意:
1、eclipse自带的mat插件可自动转换dump文件格式,可直接用mat工具打开;
2、IDEA或者android studio dump的出的hprof文件是需要转换的
转换命令是:hprof-conv src.hprof dest.hprof,完了之后再用mat工具打开;
打开dump文件后如下图:

2、Dominator Tree如下图:

点击之后如图,此时右键图选中行-》List Objects->with outgoing refrences找到外部应用的对象,如下图:

此处找到了Bitmap的引用对象,然后右键-》GC ROOT PATHS-》exclude weak/soft....排除软弱引用找到强引的对象,如下图:

到这里就能知道是哪里的业务代码导致了内存泄漏,从图中可看出
mBitmap来源于ImageView
ImageView来源-ll_mengban的child
ll_mengban来源-TopicDetailActivity的控件
TopicDetailActivity context被 mmsdk引用了;
从而导致mBitmap无法释放;
然后我们来看看TopicDetailActivity是如何被强引用的:
在TopicDetailActivity的onCreate里执行了
shareController = new ShareController(this);
然而ShareController执行了这个:
public ShareController(Activity activity) {
mActivity = activity;
ShareLoginController.getInstance(mActivity).addLoginListener(this);
}
然而ShareLoginController执行了这个:
public ShareController(Activity activity) {
mActivity = activity;
ShareLoginController.getInstance(mActivity).addLoginListener(this);
}
然而ShareLoginController构造方法执行了这个:
public ShareLoginController(Activity activity) {
if (mController == null) {
try {
mController =(UMSocialService) BeanManager.getSocialService(activity);
} catch (Exception e) {
e.printStackTrace();
}
}
if(loginListeners==null){
loginListeners = new ArrayList<IShareLoginListener>();
}
}
然而UMSocialService里把context传递给了QQsdk,导致了一直被强引用无法GC的原因;
找到了问题,解决办法就是去除这个强引用即可;
-----------------------
博客:http://iceAnson.github.io
http://iceanson.github.io/tool-mat/
工具篇-MAT(Memory Analyzer Tool)的更多相关文章
- 使用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分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...
- 【转】MAT(Memory Analyzer Tool)工具入门介绍
1.MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗 ...
- 内存分析工具-MAT(Memory Analyzer Tool)
内存分析工具-MAT(Memory Analyzer Tool) 首先查看如下代码,main函数中有一个成员变量map,map里被循环放入对象Hanson,hanson持有姓名和age还有friend ...
- MAT Memory Analyzer Tool 插件安装(图解)
MAT Memory Analyzer Tool 插件安装(图解) 原文地址 @author YHC 前段时间做了一个项目,Exception in thread "main" j ...
- Android 内存分析工具 MAT(Memory Analyzer Tool)
如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...
- MAT(Memory Analyzer Tool)内存分析工具的使用
开发.应用中老是会遇到OutOfMemory异常,而且常常是过一段时间内存才被吃光,这里可以利用java heap dump出jvm内存镜像,然后再对其进行分析来查找问题. 平常利用jmap -dum ...
- 转载:MAT Memory Analyzer Tool使用示例
地址:http://blog.csdn.net/yanghongchang_/article/details/7711911 以下是一个会导致java.lang.OutOfMemoryError: J ...
- [性能测试]:内存泄漏以及MAT(Memory Analyzer Tool)工具使用分析
一.今天在查看服务器时候,发现内存使用率直接就到99%了, 二.用ps -uaxw查看一下,每个占用内存较多的进程情况: 三,挑出可疑的进程,生成dump文件: jmap -dump:format=b ...
随机推荐
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">的含义
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/x ...
- 认识和理解css布局中的BFC
认识和理解css布局中的BFC BFC的定义 是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用. Block Formatting Con ...
- Git安装及基本使用
准备: Git软件,github账号. Git安装: 直接百度搜git下载,windows和mac不同平台的.官网上的下载地址很慢或者根本下不了. 默认配置安装. github: 网址:https:/ ...
- 通过配置Tomcat,让Android真机通过局域网访问PC的文件
在 Tomcat 根目录,找到conf\server.xml文件. 1.打开server.xml查找修改端口为8080端口: <Connector port="8080" p ...
- jira使用
JIRA的生产者把JIRA定义为Professional Issue Tracker,即它是一个专业的问题跟踪管理的软件.这里的"问题"对应的英文单词是Issue,所以含义比较广, ...
- 笔记 postgresql oid同步
以前学习postgresql的笔记 create table 消耗 OID 如create table my_test_table, 他本身会消耗一个 会在pg_type中插入两条记录_my_test ...
- 微信开发_微信教程__微信通讯框架V1.0
做个广告先, PHP千人群(6848027) C++群 (1414577) 看雪汇编&反汇编群(15375777) 看雪汇编&反汇编2群(4915800) 转载不一定注明出处,只要推荐 ...
- 8.PHP 教程_PHP字符串
字符串变量用于存储并处理文本. PHP中的字符串变量 字符串变量用于包含有字符的值. 在创建字符串之后,我们就可以对它进行操作了.您可以直接在函数中使用字符串,或者把它存储在变量中. 在下面的实例中, ...
- thinkphp phpexcel导入
上次做了一个基于tp3.2.3的phpexcel导出,这次是phpexcel导入,准备材料phpexcel(不知道下载地址的查看我上一篇博文),虽说是基于thinkphp3.2.3来的,也只不过是引入 ...
- [转]Swift 编程语言入门教程
今天在网上看到一篇非常好的教程,分享给大家 原文地址:http://gashero.iteye.com/blog/2075324 目录 1 简介 2 Swift入门 3 简单值 4 控 ...