Android meminfo

经典博文:Android内存分析命令

Android中有一些内存信息查看工具:
dumpsys meminfo
cat /proc/meminfo

今天就说说这两个之间的关系。dumpsys meminfo的信息是不同的mem命令查到的信息,通过Android代码整合计算出来,主要信息来源于/proc/meminfo。
dumpsys meminfo命令执行的代码逻辑是ActivityManagerService.java中的
dump。获取内存信息的大致流程如下
在这里插入图片描述
在MemInfoReader提供了获取不同类的内存信息的接口。信息从/proc/meminfo中的一些数据计算出来,获取的/proc/meminfo中信息如下

static const char* const tags[] = {
            "MemTotal:",
            "MemFree:",
            "Buffers:",
            "Cached:",
            "Shmem:",
            "Slab:",
            "SwapTotal:",
            "SwapFree:",
            "ZRam:",
            "Mapped:",
            "VmallocUsed:",
            "PageTables:",
            "KernelStack:",
            NULL
    };

特别说明

  1. meminfo信息

/proc/meminfo信息内容如下

MemTotal:         771016 kB
MemFree:           99764 kB
Buffers:           21900 kB
Cached:           227068 kB
SwapCached:            0 kB
Active:           370876 kB
Inactive:         201256 kB
Active(anon):     323456 kB
Inactive(anon):     5436 kB
Active(file):      47420 kB
Inactive(file):   195820 kB
Unevictable:         256 kB
Mlocked:             256 kB
HighTotal:        409600 kB
HighFree:           3900 kB
LowTotal:         361416 kB
LowFree:           95864 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                56 kB
Writeback:             0 kB
AnonPages:        323320 kB
Mapped:           150756 kB
Shmem:              5756 kB
Slab:              30964 kB
SReclaimable:      11924 kB
SUnreclaim:        19040 kB
KernelStack:        7464 kB
PageTables:        13500 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      385508 kB
Committed_AS:   22312688 kB
VmallocTotal:     385024 kB  // 在env中配置
VmallocUsed:       95068 kB
VmallocChunk:     212848 kB

dumpsys meminfo说明

Total PSS by process:  // 按照使用内存的PSS值对不同的进程进程排序
     99,920K: com.iandos.registration (pid 3511 / activities)
     64,226K: system (pid 2205)
     52,194K: com.android.systemui (pid 3051)
     17,579K: zygote (pid 1601)
     15,419K: com.android.launcher3 (pid 3087 / activities)

Total PSS by OOM adjustment:  // 按照PSS,同一个oom_adj的不同进程进行排序
     75,263K: Native
         17,579K: zygote (pid 1601)
         14,964K: cameraserver (pid 1607)
          4,056K: mediaserver (pid 1624)
     64,226K: System
         64,226K: system (pid 2205)
     99,920K: Foreground
         99,920K: com.iandos.registration (pid 3511 / activities)
     64,145K: Visible
         52,194K: com.android.systemui (pid 3051)
          6,701K: com.android.icetech (pid 3826)
          5,250K: android.ext.services (pid 3803)
     14,791K: Perceptible
         14,791K: com.google.android.inputmethod.pinyin (pid 3045)
      6,422K: A Services
          6,422K: com.softwinner.update (pid 3938)
     15,419K: Home
         15,419K: com.android.launcher3 (pid 3087 / activities)
     12,241K: B Services
         12,241K: android.process.media (pid 3786)
      5,254K: Cached
          5,254K: com.android.keychain (pid 3871)

Total PSS by category: // 按照PSS,对不同类型内容进行排序
     90,309K: Dalvik
     78,717K: Native
     52,211K: .so mmap
     37,016K: .dex mmap
     31,232K: .oat mmap
     18,347K: .art mmap

Total RAM:   770,952K (status normal)
 Free RAM:   324,074K (    5,254K cached pss +    94,020K cached kernel +   224,800K free)
 Used RAM:   400,155K (  352,427K used pss +    47,728K kernel)
 Lost RAM:    46,723K
   Tuning: 192 (large 512), oom   184,320K, restore limit    61,440K (high-end-gfx)
   
cached kernel=Buffers+Cached-Mapped   
used pss=totalPss - cachedPss
totalPss、cachedPss: 按照进程,一系列计算得来
192: dalvik.vm.heapgrowthlimit的值
large  512: dalvik.vm.heapsize的值
oom   184,320: 当内存小于这个值,会产生kernel的oom。该值对应CACHED_APP_MAX_ADJ的mimfree,
	  可通过“cat /sys/module/lowmemorykiller/parameters/minfree”查看,最后一个值乘以4(页大小为4KB)。
restore limit(61,440: 当内存压力大时,在杀掉后台进程前,释放缓存内存,保留CACHED_APP_MAX_ADJ对应的最小
	  释放内存的1/3给kernel缓存及其他(原文:1/3 the size we have reserved for kernel caches and other 
	  overhead before killing background processes)。	
(high-end-gfx):开启了硬件绘图加速,会消耗更多内存
  1. kernel占用内存计算
kernel占用内存=Shmem+Slab+VmallocUsed+PageTables+KernelStack

其中VmallocUsed没有使用/proc/meminfo中获取的值,是从/proc/vmallocinfo的信息计算而来,使用脚本计算方法如下:

VmallocUsed=$(cat /proc/vmallocinfo | grep -vE "(ioremap|map_lowmem|vm_map_ram)" | busybox awk 'BEGIN{sum=0}{sum=sum+$2}END{print sum/1024}')

vmallocinfo信息,例如下(仅部分):

a40-p1:/vendor/bin # cat /proc/vmallocinfo
0x00000000-0x00000000  307200 module_alloc_update_bounds+0x1c/0x6c pages=74 vmalloc
0x00000000-0x00000000   24576 module_alloc_update_bounds+0x1c/0x6c pages=5 vmalloc
0x00000000-0x00000000 67108864 iotable_init+0x0/0xbc phys=63000000 ioremap
0x00000000-0x00000000   36864 xt_alloc_table_info+0x8c/0xe8 pages=8 vmalloc
0x00000000-0x00000000   36864 xt_alloc_table_info+0x8c/0xe8 pages=8 vmalloc
0x00000000-0x00000000 1044480 binder_mmap+0xd0/0x258 ioremap
0x00000000-0x00000000 2097152 vm_map_ram
0x00000000-0x00000000 1044480 binder_mmap+0xd0/0x258 ioremap
0x00000000-0x00000000  528384 vb2_vmalloc_alloc+0x44/0x9c pages=128 vmalloc user
0x00000000-0x00000000  528384 vb2_vmalloc_alloc+0x44/0x9c pages=128 vmalloc user
0x00000000-0x00000000  360448 vb2_vmalloc_alloc+0x44/0x9c pages=87 vmalloc user
0x00000000-0x00000000 2097152 vm_map_ram
0x00000000-0x00000000  360448 vb2_vmalloc_alloc+0x44/0x9c pages=87 vmalloc user
0x00000000-0x00000000  360448 vb2_vmalloc_alloc+0x44/0x9c pages=87 vmalloc user
0x00000000-0x00000000 1044480 binder_mmap+0xd0/0x258 ioremap
0x00000000-0x00000000 2097152 vm_map_ram
0x00000000-0x00000000   49152 cramfs_uncompress_init+0x34/0x70 pages=11 vmalloc
0x00000000-0x00000000   49152 zisofs_init+0x14/0x30 pages=11 vmalloc
0x00000000-0x00000000  266240 pptp_init_module+0x1c/0xd4 pages=64 vmalloc
0x00000000-0x00000000   12288 zs_cpu_notifier+0x4c/0xa0 ioremap
0x00000000-0x00000000   12288 zs_cpu_notifier+0x4c/0xa0 ioremap
0x00000000-0x00000000  266240 create_log.constprop.3+0x18/0x148 pages=64 vmalloc
0x00000000-0x00000000  266240 create_log.constprop.3+0x18/0x148 pages=64 vmalloc
0x00000000-0x00000000 1044480 binder_mmap+0xd0/0x258 ioremap
0x00000000-0x00000000 1044480 binder_mmap+0xd0/0x258 ioremap
0x00000000-0x00000000 2097152 vm_map_ram
0x00000000-0x00000000 2097152 vm_map_ram
0x00000000-0x00000000   49152 iotable_init+0x0/0xbc ioremap
0x00000000-0x00000000 16777216 iotable_init+0x0/0xbc phys=1000000 ioremap
0x00000000-0x00000000  147456 pcpu_get_vm_areas+0x0/0x59c vmalloc

排除有ioremap、map_lowmem、vm_map_ram的行,把剩下的行的第二列值相加,得到VmallocUsed(单位是字节,命令计算得到的但是KB)。

一般通过dumpsys meminfo分析内存比较直观,习惯了使用原始命令,也是一样的清晰。如果可用内存消耗过快可以通过dumpsys meminfo分析,哪方面增长过快。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值