开机可用内存分析Tip

一、开机内存简介

开机内存指的是开机一段时间稳定后的可用内存。一般项目都会挑选同平台其他优秀竞品内存数据,这个也是衡量性能的一个重要标准。所以要进行开机内存检测,同时优化非法内存进程占用。

二、测试前期核查任务

开机内存测试前要进行测试机对比机内存核查参数。

主要有如下7类:

1.内存压缩参数ZRAM

zram压缩方法 :/sys/block/zram0/comp_algorithm

zram大小:/sys/block/zram0/disksize

swappiness:/proc/sys/vm/swappiness

direct_swappiness:/proc/sys/vm/direct_swappiness

2.kswap参数

extra_free_kbytes:/proc/sys/vm/extra_free_kbytes

min_free_kbytes:/proc/sys/vm/min_free_kbytes

watermark_boost_factor:/proc/sys/vm/watermark_boost_factor

lowmem_reserve_ratio:/proc/sys/vm/lowmem_reserve_ratio

watermark_scale_factor:/proc/sys/vm/watermark_scale_factor

3.lmk参数

getprop | grep lmk

4.虚拟机参数

getprop | grep heap

5.cache个数

dumpsys activity settings | grep CUR_MAX

6.zoneinfo

proc/zoneinfo | grep -in -E "Node |min |low |high |managed "

7.压缩和冻结情况

dumpsys activity settings |grep -e use_compaction -e use_freezer

三、开机内存检测

1.测试步骤

刷机后默认跳过开机向导,设置为新手机,不插卡,不联网,手机默认状态下,亮度调节最大,关闭自动背光,清理状态栏通知和后台应用。下面三个要注意:

1)开机时间要舍弃前面1-3次数据。

2)如果状态栏有其他通知,除了要清理通知,还要重启一次。

3)看下多任务里面是否还有其他后台任务,有的话要清理掉。

2.不同DDR 可用内存建议标准

目前开机内存指标为MemAvaiable MemAvaiable ~MemFree+Buffers+Cached+IonTotalCache

不同内存有不同开机内存标准值:建议值(一般达不到,除非是driveronly原生系统)

6+64:可用内存建议参考值:2.5G

6+128:可用内存建议参考值:3.9G

8+256:可用内存建议参考值:5.4G

3.开机内存测试数据来源以及对应含义

数据由指令 adb shell cat proc/meminfo 获取

1)Mem_Free -----系统空闲内存

取值:MemAvailable

2)Zram-----ZRAM交换空间大小

取值:SwapTotal - SwapFree

3)Kernel Used-----Kernel使用内存大小

取值:SUnreclaim + KernelStack + PageTables + Shmem + VmallocUsed

4)IonTotalUsed-----Ion使用大小

取值:IonTotalUsed

5)GPUTotalUsed-----GPU使用内存大小

取值:GPUTotalUsed

6)Platform Reserved-----平台预留内存

取值:总内存 -- MemTotal

meminfo中对应PSS 进程大小,Android系统有同意的内存管理策略,lmk基于进程优先级进行进程查杀,值越小优先级越高。

四、开机内存数据处理分析

主要还是从下面Mem_Free、Zram、Kernel Used、IonTotalUsed、GPUTotalUsed、Platform Reserved参数进行对比,尤其是meminfo中个进程的内存占用大小对比。

SystemRam 划分为两个部分,PlatformReserved和MemTotal,MemTotal是系统能自由分配使用内存大小。MemTotal主要包括kernel use,free 和user space。内存差异主要体现在PlatformReserved、kernel use、user space。

1.Platform_Reserved

Platform_Reserved差异就是MemoryTotal差异。Platform_Reserved = 实际物理内存 - MemTotal,需要分别解析出对比机和测试机的模块预留,通过对比可以看出是否有新增的模块或是内存占用明显变化的模块。由于这部分内存与硬件设备强相关,我们需要向高通或MTK提case咨询能否去除。

2.kernel used

kernel used = Shmem+SUnreclaim+KernelStack+PageTables+VmallocUsed这部分差异给BSP进行拆解

SReclaimable: slab 中可回收的部分,调用 kmem_getpages()时加上SLAB_RECLAIM_ACCOUNT 标记,表明是可回收的,计入 SReclaimable,否则计入 SUnreclaim。

SUnreclaim: slab 中不可回收的部分。

Slab: slab 中所有的内存,等于以上两者之和。数据来源:cat /proc/meminfo

3.kernel stack

每一个用户线程都会分配一个 kernel stack(内核栈),每个线程内核栈大小:16KB,KernelStack 的大小完全由系统中的线程数决定。该值增大一般是进程或线程数增多。 KernelStack = 线程数* 16KB

统计值是 /proc/meminfo 中的 KernelStack 。有两种情况会导致 KernelStack 增大:

  1. 新增了进程;

  2. 同一个进程线程数增多;

分析方法:找到新增的进程,找到线程增多的进程

4.VmallocUsed

VmallocUsed 值中,具体分布可以从/proc/vmallocinfo 中的 vmalloc 记录看到。

/proc/vmallocinfo 中能看到 vmalloc 来自哪个调用者(caller),这个调用者也是定位是哪个模块调用的关键信息。

通过 vmalloc 分配的内存,通过命令

adb shell cat /proc/vmallocinfo > vmallocinfo.txt 都可以抓取到详细的分配信息,且通过如下命令

grep vmalloc /proc/vmallocinfo | awk '{total+=$2}; END {print total}' 可以计算通过 vmalloc 分配总共分配了多大的内存。

5.Userspace

Userspace的内存是所有的进程(包括java层以及native层)的内存使用量之和,在内存占用中体现为匿名页占用+Zram占用。Zram用量一般为swap用量的1/3,即(Swaptotal-swapfree)/3。

建议差异分析其他问题点

1.手机分辨率、屏幕密度。720P和1080P对于带图片的应用比如桌面、systemui、相机、相册等是有影响的,所以排查进程差异时,需要考虑在内,可以设置相同分辨率后再比较

2.GMS包是否都存在以及其版本是否一样。升级项目一般会因为GMS包版本跨度大导致进程差异较大

3.排查不应该自启动的进程,或者可以不需要自启动的应用

4.属于自启动,但内存占用过多,找对应模块负责人分析

相关推荐
恋猫de小郭9 小时前
Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年
android·ide·android studio
aaaweiaaaaaa12 小时前
php的使用及 phpstorm环境部署
android·web安全·网络安全·php·storm
工程师老罗14 小时前
Android记事本App设计开发项目实战教程2025最新版Android Studio
android
pengyu17 小时前
系统化掌握 Dart 编程之异常处理(二):从防御到艺术的进阶之路
android·flutter·dart
消失的旧时光-194318 小时前
android Camera 的进化
android
基哥的奋斗历程19 小时前
Openfga 授权模型搭建
android·adb
Pakho love1 天前
Linux:文件与fd(被打开的文件)
android·linux·c语言·c++
勿忘初心912 天前
Android车机DIY开发之软件篇(九) NXP AutomotiveOS编译
android·arm开发·经验分享·嵌入式硬件·mcu
lingllllove2 天前
PHP中配置 variables_order详解
android·开发语言·php
消失的旧时光-19432 天前
Android-音频采集
android·音视频