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
};
特别说明
- 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):开启了硬件绘图加速,会消耗更多内存
- 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分析,哪方面增长过快。
上一篇: MFC按钮着色
下一篇: 上下滑动的常见视差效果
推荐阅读
-
Android TextureView 实现 Camera 相机预览、拍照--首次为 AndroidManifest 添加相机权限
-
Android 13 添加运行时权限
-
小红书 Android 面试问题汇总与参考答案
-
[Rockchip和android10 root权限 root权限]
-
Android 的四个组件内容提供程序,外部应用程序无法访问,原因很简单
-
勇敢者编译指南 2024 Android - 项目结构 (II)
-
Android 开发 TabLayout 自定义指标长度
-
Android studio 中排除文件功能的小结
-
在 Android Jetpack Compose 中刷新用户界面的几种方法
-
项目示例] - 音乐播放器 - Android 前端实现 - Java 后端实现 - 🌳 歌曲详情页面