内存分析插件-Memory Analyzer (MAT)

本文介绍了如何使用Memory Analyzer (MAT)插件进行内存分析,包括安装插件、通过DDMS获取内存快照、查看对象内存占用以及如何通过对比分析检测内存泄露。示例代码展示了Activity中因未移除callback导致的内存泄露问题。
AI助手已提取文章相关产品:
 作用:分析内存占用,检查内存泄露

使用:
1、安装插件mat
2、查看内存占用
1),DDMS界面,选中要查看的进程,然后点击Dump HPROP file(如下图),然后就会生成文件并通过mat解析

2),以下是图表的方式分析,略过,不解

3),我使用的是查看对象占用内存表,点击左上的图标
然后就会打开以下界面
Objects 列表示对象数目,Shallow Heap 表示对象占用的内存,Retained Heap表示对象及其引用对象共占用的内存

4),分析内存泄露可以通过观察Objects 数目,更进一步地分析就是程序运行后就Dump HPROP file,再等过段时间再Dump HPROP file一次,前后两次对比对象数目来判断。

示例代码:

public class MainActivity extends Activity {
 private LinearLayout root;
 class Leaky {
 }
 List list = new ArrayList();
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  root = (LinearLayout) findViewById(R.id.root);
 }
 public void onClick(View v) {
  switch (v.getId()) {
  case R.id.bt1:
   for (int i = 0; i < 1000; i++) {
    list.add(new Leaky());
   }
   break;
  case R.id.bt2:
   list.clear();
   break;
  }
 }
}

点击bt1,然后Dump HPROP file,看到如下生成了1000个Leaky对象

点击bt2,释放leaky,Dump HPROP file后看到查看leaky对象数目为0 (正则匹配显示)

以上就是一个直观的查看对象数目、对象占用内存情况

还可以对比分析
再点击bt1,然后Dump HPROP file,接着点击compare...
然后在弹出选着对比文件中,选中刚刚dump的文件

然后会看到如下对比结果
很清晰的就知道点击bt1后进程的对象增加情况。项目内存泄露既可以通过这样前后对比推测哪些对象未被回收而造成泄露了

ViewGroup.removeAllViews();调用这个方法在清空子view的时候,如果子view有添加了callback,则必须要在view移除的回调(比如onDetachedFromWindow) 中removecallback,否则子view无法释放。


您可能感兴趣的与本文相关内容

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值