android app内存分析,Android内存分析:profiler + MemoryAnalyzer (MAT)

一些内存泄漏的场景:

1 非静态内部类的静态实例

2 多线程相关的匿名内部类/非静态内部类

3 Handle内存泄漏

4 未正确使用 Context

5 静态View

6 WebView

7 资源对象未关闭

8 集合中对象没清理

9 Bitmap对象

10 监昕器未关闭

根据内存泄漏场景1,写一个内存泄漏的Activity:

public class MemoryTestActivity extends AppCompatActivity {

static Inter mInter;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_memory_test);

mInter = new Inter();

}

class Inter{

}

}

运行app,使用AndroidStudio(v4.0.2)的profiler工具进行分析:

打开这个MemoryTestActivity,然后finish,使用AndroidStudio底部的profiler工具查看app运行状态,如下图:

e0a71adeffdc

0.png

点击MEMORY

e0a71adeffdc

1.png

点击 Dump Java heap,会生成下面的堆信息(手动选中下图的1,2处)

e0a71adeffdc

2.png

从上图可以看到MemoryTestActivity有内存泄漏,泄漏内存272字节。

这里的代码比较简单,是主动写的一个泄漏情景来测试用的,在实际开发中,可能即使找到了内存泄漏的Activity,也并不容易分析出内存泄露的原因,就需要使用MAT工具对这个HeapDump数据进行分析

使用MAT工具分析这个 HeapDump 数据

1 保存 HeapDump 数据

在上图标记3处,右键-->Export...-->保存到电脑中,命名为a.hprof

2 使用hprof-conv工具转换数据格式

hprof-conv是androidSDK中的一个工具,在platform-tools目录中:$(SDK_HOME)\platform-tools\hprof-conv.exe,使用CMD命令:

E:\temp>hprof-conv -z a.hprof a-mat.hprof

打开MemoryAnalyzer,点击左上角File-->Open Heap Dump...,打开a-mat.hprof

e0a71adeffdc

3.png

点击Histogram,查看柱状图,在Class name下面输入MemoryTestActivity,回车,进行过滤,可以看到内存泄漏的Activity

(也可以使用上面的OQL进行查询)

e0a71adeffdc

4.png

在MemoryTestActivity(标记2处)上右键-->Merge Shortest ... -->exclude all ... ,进入merge_shortest_paths视图

e0a71adeffdc

5.png

在上面的上图中,可以看到mInter的引用,由于mInter是静态的,所以MemoryTestActivity退出后不会销毁,而这个Inter类是非静态内部类,会持有MemoryTestActivity的引用,所以MemoryTestActivity不会被回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值