哈喽,艾瑞巴蒂,又在一个美好的周二和大家见面了,大家在平时测试中会关注内存占用的问题么?都需要关注哪些指标呢?接下来小编就和大家一起了解下~
初识Dumpsys meminfo
接下来我们从一张图片来了解”Dumpsys meminfo”这个工具,大家看到这个图一定很懵逼,小编刚开始看到的时候也是这个感觉,不过小编已经给大家准备了”福利”
Pss TOTAL: 内存所实际占用的值。
Dalvik Heap Size: 从RuntimetotalMemory()获得,DalvikHeap总共的内存大小。
Dalvik Heap Alloc: 从RuntimetotalMemory()获得,DalvikHeap总共的内存大小。
Dalvik Heap Free: 从RuntimefreeMemory()获得,DalvikHeap剩余的内存大小。
Dalvik Heap Size: 约等于Dalvik HeapAlloc+ Dalvik HeapFree。
.so mmap C 库代码占用的内存。
.jar mmap: Java 文件代码占用的内存。
.apk mmap: apk代码占用的内存。
.ttf mmap: ttf 文件代码占用的内存。
.dex mmap: Dex 文件代码占用的内存。
Other mmap: 其他文件占用的内存。
Ashmem:
/dev/ashmem,匿名共享内存用来提供共享内存通过分配一个多个进程可以共享的带名称的内存块。
Other dev:
/dev/,内部driver占用的在 “Otherdev”。
Dumpsys meminfo名词了解
1、私有(Clean and Dirty)内存
进程独占的内存。也就是应用进程销毁时系统可以直接回收的内存容量。通常来说,“private dirty”内存是其最重要的部分,因为只被自己的进程使用。它只在内存中存储,因此不能做分页存储到外存(Android不支持swap)。所有分配的Dalvik堆和本地堆都是“private dirty”内存;Dalvik堆和本地堆中和Zygote进程共享的部分是共享dirty内存。
2、实际使用内存 (PSS)
这是另一种应用内存使用的计算方式,把跨进程的共享页也计算在内。任何独占的内存页直接计算它的PSS值,而和其它进程共享的页则按照共享的比例计算PSS值。例如,在两个进程间共享的页,计算进每个进程PPS的值是它的一半大小。PSS计算方式的一个好处是:把所有进程的PSS值加起来就可以确定所有进程总共占用的内存。这意味着用PSS来计算进程的实际内存使用、进程间对比内存使用和总共剩余内存大小是很好的方式。
Ps:通常来说,只需关心Pss Total列和Private Dirty列就可以了。
3、.so mmap和.dex mmap
mmap映射的.so(本地) 和.dex(Dalvik)代码使用的内存。
Pss Total 包含了跨应用共享的平台代码;
Private Clean是应用独享的代码。
Ps:通常来说,实际映射的内存大小要大一点——这里显示的内存大小是执行了当前操作后应用使用的内存大小。然而,.so mmap 的private dirty比较大,这是由于在加载到最终地址时已经为本地代码分配好了内存空间。
4、Unknown
无法归类到其它项的内存页。目前,这主要包含大部分的本地分配,就是那些在工具收集数据时由于地址空间布局随机化(Address Space Layout Randomization ,ASLR)不能被计算在内的部分。和Dalvik堆一样, Unknown中的Pss Total把和Zygote共享的部分计算在内,Unknown中的Private Dirty只计算应用独自使用的内存。
5、ViewRootImpl
进程中活动的根视图的数量。每个根视图与一个窗口关联,因此可以帮助确定涉及对话框和窗口的内存泄露。
6、AppContexts和Activities
当前驻留在进程中的Context和Activity对象的数量。可以很快的确认常见的由于静态引用而不能被垃圾回收的泄露的 Activity对象。这些对象通常有很多其它相关联的分配,因此这是追查大的内存泄露的很好办法。
注意:View 和 Drawable 对象也持有所在Activity的引用,因此,持有View 或 Drawable 对象也可能会导致应用Activity泄露。
小编特别奉献
Python+UIAutomator获取内存信息
from uiautomator import device as d import os import time d.screen.on() d(text=u"搜狗贷款大全").click() // 通过text打开应用程序 package_name ="com.sogou.loanmart" phone_sn ="860BDMR226D4" info = [] def meminfo(phone_sn, apk_package_name): try: meminfo = os.popen("adb -s {0} shell dumpsys meminfo {1} ".format (phone_sn,apk_package_name)).read() pss = meminfo.split() print pss except IndexError: pss ="" return pss #获取内存值,并写入到文件 with open("mem.txt",'w+')as m: for i in range(10): pss_value = meminfo(phone_sn,package_name) print type(pss_value) time.sleep(2) m.write(pss_value + " ") cmd='adb shell am force-stop com.sogou.loanmart' os.system(cmd) #代码还需优化,请谨慎~