您的位置:首页 > 其它

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

2014-01-12 21:48 120 查看
作用:分析内存占用,检查内存泄露

使用:
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无法释放。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: