内存的测试是属于性能测试的,因此可以参考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>

由于刚换了电脑,没有安装环境,因此我百度了一张图片:

APP专项测试:内存_Memory

我们需要分析的是:Native/Dalvik 的 Heap和Total 的 PSS

其中:Native/Dalvik 的 Heap一直增长说明存在内存泄漏了。Total是应用占据的所有内存大小,过大会导致应用被强制杀死。

此外Heap Free占用过大,波动大,说明对象被频繁的GC,需要定位以下是哪些对象在被频繁的GC。

经验:

内存分配的最小单位是页面,通常大小为4kb,这个限制往往会引发各种碎片问题。

性能优化:

1.尽量不要在循环中创建很多临时变量。

2.尽量将大型的循环拆散,分段或者按需执行

3.dex文件有很多优化空间。仔细统计并调整dex文件顺序后,往往能够节约1MB以上的mmap内存。

4。引入SDK库和调用新的系统API时需要考虑成本。有可能一些不常用的功能会导致大量的消耗。这时候有可能需要多进程方案,将这些影响内存的操作放入临时进程执行。