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 RAM:used pss+kernel+trace buffer+ion display+cma usage(系统native service PSS总和+meminfo的Shmem+Slab+PageTables+kernelStack+vmallocinfo里面的ioremap项+map_lowmem项所占内存的和+meminfo里面的display ion模块内存占用+cma模块占用等等)

  • 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模块占用
Lost RAM:Total RAM-cached pss-used pss-free-cached kernel-kernel

ZRAM:8k->是获取的/sys/block/zram0/mem_used_total的值,0k->指meminfo的SwapTotal-SwapFree.

Tuning:这一行主要是system的一些设置,此处不做解释。

到这里dumpsys meminfo的执行流程就到这里,后续将继续讲meminfo各项的含义。

原创粉丝点击