关于Android应用内存占用查看及优化
2014-05-09 13:25
197 查看
第一步:
查看内存使用情况
我常用的查看内存使用情况的两种方式:
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来实现。
查看内存使用情况
我常用的查看内存使用情况的两种方式:
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来实现。
相关文章推荐
- 关于android应用内存占用查看及优化
- 关于android应用--内存的优化
- 关于android应用--内存的优化
- 关于Android应用中图片占用内存浅谈
- android查看当前应用占用的内存空间
- 关于android应用--内存的优化
- Android dos命令查看应用内存占用情况
- 关于android应用--内存的优化
- 「android」查看应用占用cpu和内存消耗情况
- 关于Android中listView的复用及优化问题详解,应用开发者应多多使用,是app更顺畅,让用户更好体验!
- 优化Android应用内存的若干方法
- 如何查看Android应用使用的内存
- Android资源图片内存占用及优化
- [原创] android应用性能测试之CPU和内存占用
- 如何使用DDMS Heap查看Android应用内存情况
- 关于android当中Service读取应用中的内存数据不更新问题
- android应用内存占用测试(每隔一秒打印procrank的信息)
- 关于Android内存、性能优化的一些细节
- 关于Android中图片大小、内存占用与drawable文件夹关系的研究与分析