dumpsys meminfo执行流程(三)
来源:互联网 发布:好用的软件 编辑:程序博客网 时间:2024/05/16 13:50
这一节主要介绍dumpsys meminfo获取的数据是如何得到的。
首先看一下命令执行后的输出:
………………631K: akmd09912 (pid 431)………………187,163K: com.android.systemui (pid 1942)………………Total RAM: 1,845,568K (status moderate) Free RAM: 520,576K ( 232,788K cached pss + 207,248K cached kernel + 80,540K free + 0K ion cached + 0K gpu cached) Used RAM: 1,882,255K (1,495,695K used pss + 332,360K kernel + 56K trace buffer + 54,144K ion disp + 0K cma usage) Lost RAM: -90,749K ZRAM: 175,348K physical used for 750,476K in swap ( 922,780K total swap) KSM: 41,132K saved from shared 3,244K 154,928K unshared; 25,028K volatile Tuning: 256 (large 512), oom 322,560K, restore limit 107,520K (high-end-gfx)首先要说的是native进程(也就是这里的akmd09912)所占用的内存大小(也就是这里的631K)
从前面的文章中我们知道,计算native process的代码片段如下:
synchronized (mProcessCpuTracker) { final int N = mProcessCpuTracker.countStats(); for (int i=0; i<N; i++) { ProcessCpuTracker.Stats st = mProcessCpuTracker.getStats(i); if (st.vsize > 0 && procMemsMap.indexOfKey(st.pid) < 0) { if (mi == null) { mi = new Debug.MemoryInfo(); } if (!brief && !oomOnly) { Debug.getMemoryInfo(st.pid, mi); } else { mi.nativePss = (int)Debug.getPss(st.pid, tmpLong, null); mi.nativePrivateDirty = (int)tmpLong[0]; } final long myTotalPss = mi.getTotalPss(); totalPss += myTotalPss; nativeProcTotalPss += myTotalPss; MemItem pssItem = new MemItem(st.name + " (pid " + st.pid + ")", st.name, myTotalPss, st.pid, false); procMems.add(pssItem); nativePss += mi.nativePss; dalvikPss += mi.dalvikPss; for (int j=0; j<dalvikSubitemPss.length; j++) { dalvikSubitemPss[j] += mi.getOtherPss( Debug.MemoryInfo.NUM_OTHER_STATS + j); } otherPss += mi.otherPss; for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) { long mem = mi.getOtherPss(j); miscPss[j] += mem; otherPss -= mem; } oomPss[0] += myTotalPss; if (oomProcs[0] == null) { oomProcs[0] = new ArrayList<MemItem>(); } oomProcs[0].add(pssItem); } } }其中final long myTotalPss = mi.getTotalPss();即为计算native process内存占用总量语句。
public int getTotalPss() { return dalvikPss + nativePss + otherPss; }可以看出native process的内存占用总量等于nativePss, dalvikPss以及otherPss,根据前面第二节native层计算进程Pss流程可知:
nativePss, dalvikPss以及otherPss的值对应就是HEAP_NATIVE,HEAP_DALVIK以及HEAP_UNKNOWN,再次分解就是以下这些项的和:
HEAP_DALVIK, HEAP_NATIVE,HEAP_DALVIK_OTHER,HEAP_STACK,HEAP_CURSOR,HEAP_ASHMEM,HEAP_GL_DEV,HEAP_UNKNOWN_DEV,HEAP_SO,HEAP_JAR,HEAP_APK,HEAP_TTF,HEAP_DEX,HEAP_OAT,HEAP_ART,HEAP_UNKNOWN_MAP,HEAP_GRAPHICS,HEAP_GL,HEAP_OTHER_MEMTRACK, HEAP_UNKNOWN.
下面以一个native进程 zygote为例,其dump的数据如下:
根据以上说明,zygote所占用的内存总量就等于Native Heap+Dalvik Heap+Dalvik Other+stack+Other dev(HEAP_UNKNOWN_DEV)+.so mmap+.jar mmap+.apk mmap+.ttf mmap+.oat mmap+.art mmap+Other mmap(HEAP_UNKNOWN_MAP)+Unknown(减去以上被计算在HEAP_UNKNOWN中的值以后剩下的HEAP_UNKNOWN)=1357+2443+115+52+1+7770+88+276+783+10653+3210+1083+311=28142KB(图中Pss Total列所有项的和)。
而APP所占内存总量的计算类似:
计算方法类似,这里不做描述。
下面讲系统总体memory总体的描述:
以下是说明:
Total RAM:proc/meminfo里面的MemTotal的值;
Free RAM:cached pss+cached kernel+free+ion cached+gpu cached(系统cached APP PSS总和+meminfo的MemFree+Cached+Buffers-Mapped+meminfo的display ion和gpu模块的内存占用)
- cached pss:dumpsys meminfo中 cachedAPP那一栏的PSS总和
- cached kernel:meminfo的Cached+Buffers-Mapped
- free:meminfo的MemFree
- ion cached以及gpu cached:display相关ion和gpu模块的内存占用
- used pss:native process PSS+dumpsys meminfo APP除cached部分的PSS总和
- kernel:meminfo的Shmem+Slab+PageTables+kernelStack+vmallocinfo里面的ioremap项+map_lowmem项所占内存的和
- ion disp:display相关的ion模块内存占用
- cma usage:cma模块占用
ZRAM:8k->是获取的/sys/block/zram0/mem_used_total的值,0k->指meminfo的SwapTotal-SwapFree.
Tuning:这一行主要是system的一些设置,此处不做解释。
到这里dumpsys meminfo的执行流程就到这里,后续将继续讲meminfo各项的含义。
- dumpsys meminfo执行流程(三)
- dumpsys meminfo执行流程(一)
- dumpsys meminfo执行流程(二)
- Dumpsys meminfo
- adb shell dumpsys meminfo
- dumpsys meminfo 说明
- Android procrank && dumpsys meminfo使用详解
- Android使用procrank和dumpsys meminfo分析内存占用情况
- Android使用procrank和dumpsys meminfo分析内存占用情况
- 通过dumpsys meminfo命令查看一个进程的内存情况
- procrank和dumpsys meminfo的pss大小不同的原因
- 基础三:控制执行流程
- meminfo
- adb shell dumpsys meminfo <packageName> [-d] 查看app(进程)的内存占用(未完待续)
- Spark算子执行流程详解之三
- dumpsys
- dumpsys
- dumpsys
- 快速创建一个hibernate,helloworld-demo
- eclipse配置Maven插件配置
- VUE第一天
- C++ 实现决策树 ID3 算法
- 我跟编程缘分如何
- dumpsys meminfo执行流程(三)
- C++ Primer Plus 读书笔记——C++的基本特征
- python 数据分析
- 日期计算
- C语言运算符优先级列表(超详细)
- Flask-Jinja2模板学习总结
- Calling Circles UVA
- 动态链接库重定向
- Spring Cloud 中使用zookeeper作为服务注册中心与配置中心