关于Android应用内存占用查看及优化

第一步:

查看内存使用情况

我常用的查看内存使用情况的两种方式:

1、使用命令:adb shell dumpsys meminfo $package_name or $pid

VSS:Virtual Set Size,虚拟耗用内存(包含共享库占用的内存);

RSS: Resident Set Size,实际使用物理内存(包含共享库占用的内存);

PSS:Proportional Set Size,实际使用物理内存(比例分配共享库占用的内存);

USS:Unique Set Size,进程独自占用的物理内存(不包含共享库占用的内存);

Heap Size:堆大小;

Heap Alloc:分配的堆大小;

Heap Free:空闲的堆大小;

Pss:实际使用物理内存(比例分配共享库占用的内存);

PrivateDirty:非共享的,又不能换页出去的内存大小;

SharedDirty:共享的,又不能换页出去的内存大小;


2、

通过ddms查看


如果通过监控发现内存居高不下,一直增长,基本上我们的程序就出现了内存泄露。

第二步:

详细分析内存泄露的问题

我喜欢用MAT工具来分析对象释放情况,MAT插件的的安装我在这里就不详细叙述了,同学们可以自行google

通过MAT工具分析.hprof文件,我们一般可以得到如下图:


上面有分析结果的怀疑对象

然后是怀疑对象的详细信息,如图:


然后我们还可以分析dominator_tree,如果某个页面调用finish之后还是无法释放,重复进入多次之后,从dominator_tree中我们将能看到该类的很多实例,而且不断增多,连成一片。

如下图:


这里举一个例子,以前我们的应用中使用了ListView.addFooterView()这个方法,但没注意文档的说明:NOTE: Call this before calling setAdapter。我们为了显示不同状态的footerview,不断的动态调用ListView.addFooterView(),功能实现了而且使用时间短也不会发生crash。但是使用时间一长就必发生OOM。然后通过MAT分析,dominator_tree分析,发现里面有成片的listview无法释放,导致activity也无法释放,内存不断上涨,最终发生OOM。这也是个教训,ListView.addFooterView()这个方法一定要放在setAdapter之前调用。如果要显示不同的状态,推荐使用FooterView里面子控件的setVisibility来实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值