内存的测试是属于性能测试的,因此可以参考Liunx性能测试方法和指标,常用的测试方法包括Monkry/UIAutomator类的常规压力测试,长时间运行的稳定性测试,这些方法都可以叠加在内存测试的方案中,观察这些场景下应用的内存情况,经常能够发现类似内存泄漏或OOM的问题。而这些问题主要集中在以下3类场景中:
第一类:包含了图片显示的界面
第二类:网络传输大量数据:
第三类:需要缓存数据的场景:
在上面3种情况下,设计测试用例的时候一定要考虑内存变化:
1.结合场景比较操作前后或不同版本的内存变化;
2.显示多张图片的前后台进程;
3.多个场景来回切换;
4.长时间运行进程的内存增长;
内存的主要组成:
1.Native Heap:Native代码分配的内存,虚拟机和安卓框架本身也会分配内存。
2.Dalvik Heap:Java代码分配的对象;
3.Dalivik Other:类的数据结构和索引;
4.so mmap:Native代码和常量;
5.dex mmap:Java代码和常量;
内存的测试工具:
1.Android Studio/Memory Monitor:观察Dalvik内存
2.dumpsys meminfo :观察整体内存
3.smaps:观察整体内存的详细组成
4.Eclipse Memory Analyzer:详细分析Dalvik内存
下面我将着重讲解一下adb命令dumpsys meminfo:
1.adb查看手机内存的命令:
adb shell dumpsys meminfo <package_name| pid>
由于刚换了电脑,没有安装环境,因此我百度了一张图片:
我们需要分析的是:Native/Dalvik 的 Heap和Total 的 PSS
其中:Native/Dalvik 的 Heap一直增长说明存在内存泄漏了。Total是应用占据的所有内存大小,过大会导致应用被强制杀死。
此外Heap Free占用过大,波动大,说明对象被频繁的GC,需要定位以下是哪些对象在被频繁的GC。
经验:
内存分配的最小单位是页面,通常大小为4kb,这个限制往往会引发各种碎片问题。
性能优化:
1.尽量不要在循环中创建很多临时变量。
2.尽量将大型的循环拆散,分段或者按需执行
3.dex文件有很多优化空间。仔细统计并调整dex文件顺序后,往往能够节约1MB以上的mmap内存。
4。引入SDK库和调用新的系统API时需要考虑成本。有可能一些不常用的功能会导致大量的消耗。这时候有可能需要多进程方案,将这些影响内存的操作放入临时进程执行。