开机可用内存分析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.属于自启动,但内存占用过多,找对应模块负责人分析

相关推荐
AaVictory.36 分钟前
Android 开发 Java中 list实现 按照时间格式 yyyy-MM-dd HH:mm 顺序
android·java·list
似霰2 小时前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
大风起兮云飞扬丶2 小时前
Android——网络请求
android
干一行,爱一行2 小时前
android camera data -> surface 显示
android
断墨先生2 小时前
uniapp—android原生插件开发(3Android真机调试)
android·uni-app
无极程序员3 小时前
PHP常量
android·ide·android studio
萌面小侠Plus5 小时前
Android笔记(三十三):封装设备性能级别判断工具——低端机还是高端机
android·性能优化·kotlin·工具类·低端机
慢慢成长的码农5 小时前
Android Profiler 内存分析
android
大风起兮云飞扬丶5 小时前
Android——多线程、线程通信、handler机制
android
L72565 小时前
Android的Handler
android