原生android的内存性能提升方面的测试和优化方案大致设计

一 测试目标:
以满足用户设备的内存性能和不杀后台为目标。
1:满足用户设备的内存性能是指不出现因为内存原因导致的安卓设备死机,卡顿等问题。

2:满足不杀后台是指整个设备使用时,不出现后台app被杀。
通常是估算如果有后台被杀,则该设备所最多能容纳的app数量值。


二 测试思路:
原生android的内存架构设计会优先考虑内存性能,为了性能,会牺牲掉后台app驻留能力。
所以可以首要关注满足不杀后台这一目标。

另外实际应用中,多是需要做上面测试目标的第2个估算,所以下来会针对这个做详细设计。
可以在测试时,选取首次出现杀后台问题的这一时间点,捕获下此时系统对应的整机内存分布,以便算出设备容纳的app数量以及还有无优化空间。


三 测试方法:
1: 清空android设备内存驻留的所有app,并重启。

2:开机后,测试app启动后,操作2分钟,再退出启动下一个app.
这样连续启动操作若干个app,直至出现第一个后台杀进程时,捕获下此时系统对应的整机内存分布,并记录下此时已经启动并操作过的app数目。
(选取app时, 一般选取用户场景中高频使用的app)

3:估算杀进程时间点对应的整机总共消耗内存容量大小:
(totalpss - totalswappss)(用户态内存消耗) +  
(shmem + slab_unreclaimable + vmalloc_used + page_tables + kernel_stack + ion_heap)(内核态内存消耗,很多是/proc/meminfo里面的) +
memInfo.getZramTotalSizeKb() (zram占的实际物理内存大小)


四 进一步的提升后台驻留能力方面的优化方法: (目前可以做的优化)

如果目标是在不牺牲性能的情况下,使得有更多的app可以驻留后台:
则首先需要检查:
1:各app的内存消耗是否正常。
需要采集下app位于前台和后台两个不同的内存消耗值,然后拿该两个内存值和同类型(比如都是天气预报app)的其他app的这两个数值做比较。
分析该app的内存占用是否有异常。(异常包括有无内存泄漏或者内存占用不合理)

异常对应处理措施:
1)app位于前台时,采集的是其最大峰值内存占用,还需要捕获到对应的app进程栈回溯上下文,辅助app开发者找到哪地方代码占内存有问题。
2)位于后台时,如果内存占用不合理,多是因为该app退到后台时,其占用的图形内存资源没有释放,需要优化该app。


2: 系统工作集的内存消耗是否正常.
android整机内存占用可以分为三大块:
系统工作集 + 用户感知app + 后台的非感知app

系统工作集内存消耗:包括adj<0的系统所有进程pss内存占用总和,还有内核态内存消耗.

这个系统工作集内存消耗具体统计上面三 测试方法里面有提到。
可以和其他的同类型(都是车载机),同软件大版本的android设备做比较,来发现其内存占用是否异常。

异常对应处理措施:
内核态除了ION heap之外,其他几项不会占内存太多,除非有内存泄漏问题出现。
ION heap可以用我这边专门工具捕获到每一块ION内存对应的线程栈回溯上下文。这样可以辅助分析哪块ION内存占用不合理。


3:后台cached级别进程是否已经被冻结,其占用的用户态内存是否已经被回收掉。
这个cached级别进程就是上面说的后台非感知app。

现在原生android14版本对cached进程是会冻结,并回收其内存资源的。
可以通过看进程栈回溯上下文,检查有无真正被冻结,另外通过dumpsys meminfo命令看其用户态占用内存是否已经被回收掉。


4:app退到后台时,除了上面提的用户感知app之外,其他app是否已经退到cached级别。

1)如果发现有没退到cached级别,但又不会被用户感知的app,则估计是该app利用了系统缺陷,做了后台优先级提升工作。
此时,需要把该app降级,并重新退到cached级别。

2)如果可感知app稍微比较多,则需要评估需要有这么多这种类型的app存在。
因为此类app多的话,影响系统内存回收,增大系统总内存占用消耗。


其次如果上面三 测试方法中的步骤3算出的系统总内存消耗和ddr总内存的差值比较大时(1G以上),
则表明在系统有比较多的可用内存时,还发生了杀后台现象。
这个是原生安卓过于重视内存性能,忽视后台驻留的一个不足缺陷,
具体原因是lmkd采用了mem psi方式杀进程,该杀进程方式比较活跃,一旦稍微有内存压力,就会杀后台进程。
需要对Lmkd做改进。


五:识别内存性能问题以及相应的优化  (目前可以做的优化)
上面提的是优化杀后台问题,提升后台app驻留能力。
另外针对平时测试场景中的死机卡顿这些性能问题,也需要有针对性的优化方案部署。

1 卡顿测试方法:

可以在发版本之前跑monkey或者mtbf测试,并且版本要带上卡顿检测功能。

这样在跑测试时,如果有前台app操作卡顿问题,会自动输出相关的捕获log.(会有第一现场的bugreport log生成)

2 卡顿问题分析:

卡顿分必现卡顿和偶现卡顿:
必现卡顿可以通过systrace和simpleperf等性能工具,来看出卡顿原因。

偶现卡顿则需要部署卡顿检测功能,提升系统的可观测性。
该功能可以做到:
每次安卓设备端出现卡顿问题时,可以输出cpu端,io端和内存端的各自性能耗时数据(都在卡顿检测功能输出的log里面),这样可以通过数据初步知道该卡顿问题主要是cpu,io和内存这3大块哪块导致的。

如果是内存,则可以通过bugreport  log,再结合上面提升后台驻留方面的优化方法,来分析是否有内存泄漏,或者内存占用不合理等。
如果是IO,则可以通过进一步的IO打点log,来看出是存储IO栈的哪一层导致的问题,是内核层,还是存储设备端导致的问题。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch版本、安装和检验

基于conda包的环境创建、激活、管理与删除 CUDA版本 CUDA 是 NVIDIA 专为图形处理单元 (GPU) 上的通用计算开发的并行计算平台和编程模型&#xff0c;CUDA版本需满足对应的Pytorch要求 进入NVIDIA控制面板 进入左下角“系统信息”&#xff0c;找到组件 “NVIDIA CUDA 12.3.10…

7. 有奖猜谜

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小明很喜欢猜谜语。 最近&#xff0c;他被邀请参加了 X 星球的猜谜活动。 每位选手开始的时候都被发给 777777 个电子币。 规则是&#xff1a;猜对了&#xff0c;手…

PostgreSQL关闭数据库服务的三种模式

PostgreSQL 提供了三种关闭数据库服务的不同方式&#xff0c;它们最终都是发送一个关闭信号到 postgres 主服务进程。 智能关闭模式 智能关闭&#xff08;Smart Shutdown&#xff09;模式向 postgres 主服务进程发送一个 SIGTERM 信号。此时服务器不允许新的客户端连接&#…

DNS 杂谈

一、定义 DNS&#xff08;Domain Name System&#xff09;&#xff0c;域名系统&#xff0c;该系统记录域名和Ip地址的相互映射关系。用户访问互联网时&#xff0c;通过域名地址得到对应的IP地址&#xff0c;这个过程称为域名解析。DNS运行于UDP协议之上&#xff0c;使用的端口…

手撸俄罗斯方块(一)——简单介绍

手撸俄罗斯方块 简单介绍 《俄罗斯方块》&#xff08;俄语&#xff1a;Тетрис&#xff0c;英语&#xff1a;Tetris&#xff09;&#xff0c;是1980年末期至1990年代初期风靡全世界的电脑游戏&#xff0c;是落下型益智游戏的始祖&#xff0c;电子游戏领域的代表作之一&a…

【代码随想录】【算法训练营】【第64天】 [卡码117]软件构建 [卡码47]参加科学大会

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 64&#xff0c;周三&#xff0c;继续ding~ 题目详情 [卡码117] 软件构建 题目描述 卡码117 软件构建 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 [卡码…

算法的复杂度

文章目录 一、算法的效率1、复杂度的概念2、复杂度的重要性 二、时间复杂度三、空间复杂度四、大O的渐进表示发五、计算复杂度案例1、计算Func1函数的复杂度2、计算Fun2的时间复杂度3、计算Func3的时间复杂度4、计算Func4的时间复杂度5、计算strchr的时间复杂度6、计算Func5的时…

大模型/NLP/算法面试题总结5——Transformer和Rnn的区别

Transformer 和 RNN&#xff08;循环神经网络&#xff09;是两种常见的深度学习模型&#xff0c;广泛用于自然语言处理&#xff08;NLP&#xff09;任务。 它们在结构、训练方式以及处理数据的能力等方面有显著的区别。以下是它们的主要区别&#xff1a; 架构 RNN&#xff0…

MySQL空间索引

空间类型是建立在空间类型字段上的。 空间类型 MySQL的空间类型很多&#xff0c;我就不逐一介绍了。重要分四大类&#xff1a; GeometryCurveSurfaceGeometryCollection 前三种&#xff0c;地理、曲线、曲面都是不可实例化的。Geometry有一个子类Point, Curve有一个直接子类L…

docker无法拉取镜像,推荐可以使用下面镜像源

sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF { "registry-mirrors": ["请替换为您自己的代理服务ip或者域名"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker 查看是否换源成功 docker info …

电脑误删除的文件怎么恢复免费 电脑误删文件导致无法开机怎么办

在使用电脑的时候&#xff0c;有时候可能会因为一些错误的操作&#xff0c;导致删除一些文件&#xff0c;如果是普通的文件&#xff0c;最坏的情况也就是文件找回来&#xff0c;如果删除的是系统文件&#xff0c;那么很有可能导致电脑开不了机。下面就给大家详细讲解&#xff0…

Spring Boot项目Jar包加密详解

目录 引言Jar包加密的基础知识 为什么需要加密Jar包Jar包加密的基本原理 常用的Jar包加密工具 ProGuardJavaguardJava Agent Spring Boot项目Jar包加密实战 使用ProGuard对Spring Boot项目进行加密集成Javaguard到Spring Boot项目中通过Java Agent实现动态加密 Jar包加密的安全…

什么牌子充电宝好用?推荐四款质量与性价比双优充电宝!

在如今高度数字化的生活中&#xff0c;充电宝已经成为我们日常生活中必不可少的电子设备。然而&#xff0c;随着市场上充电宝品牌的不断增多&#xff0c;人们对充电宝的质量和安全性也越来越关注。充电宝作为一个涉及电池和充电技术的产品&#xff0c;安全性至关重要。选择一款…

打造Perl编译器后端:自定义编程语言的终极指南

&#x1f6e0;️ 打造Perl编译器后端&#xff1a;自定义编程语言的终极指南 在编程语言的世界里&#xff0c;编译器后端是将中间代码转换成目标代码的桥梁。对于Perl这样一种强大的脚本语言&#xff0c;实现自定义的编译器后端不仅可以加深对其内部机制的理解&#xff0c;还可…

gosnmp库 - GetBulk() | Walk()

GetBulk() 方法 GetBulk()方法是对GetNext()方法的二度封装,GetNext()方法返回的是传入的oid的下一个对象,而GetBulk方法则是返回传入的oid的接下来的N个对象。 通过GetBulk传入的oid,SNMP代理会根据传入的参数去循环取值,构造PDU,但是,如果符合传入的oid的对象的数量超…

防火墙安全策略用户认证综合实验

生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 办公区设备10.0.2.10不允许访问DMz区的FTP服务器和HTTP服务器&#xff0c;仅能ping通10.0.3.10 办公区分为市场部和研发部&#xff0c;研发部Ip地址固定&#xff0c;访问dmz区使用匿名认证&#xff0c;市场部需…

王道计算机数据结构+插入排序、冒泡排序、希尔排序、快速排序、简单选择排序

本内容是基于王道计算机数据结构的插入排序、冒泡排序、希尔排序、快速排序、简单选择排序整理。 文章目录 插入排序算法性能代码 冒泡排序算法性能代码 希尔排序算法性能代码 快速排序算法性能代码 简单选择排序算法性能代码 插入排序 算法 算法思想&#xff1a;每次将一个…

16. Revit API: Family、FamilySymbol、FamilyInstance

前言 前面写着一直絮絮叨叨&#xff0c;感觉不好。想找些表情包来&#xff0c;写得好玩点&#xff0c;但找不到合适的&#xff0c;或者说耗时费力又不满意&#xff0c;而自个儿又做不来表情包&#xff0c;就算了。 其次呢&#xff0c;之前会把部分类成员给抄表列出来&#xf…

如何使用Vger对已经过身份验证的Jupyter实例进行安全检测

关于Vger Vger是一款功能强大的交互式命令行应用程序&#xff0c;广大研究人员可以利用Vger与已经过身验证的Jupyter实例进行交互&#xff0c;并对其执行人工智能或机器学习方面的安全检测操作。 使用场景 1、作为红队研究人员&#xff0c;当我们寻找到了Jupyter凭证之后&…

前端工程化(01):10款自动化构建工具初识。

前端工程化自动化构建工具是用于简化前端开发流程、提高开发效率和优化项目质量的工具。市面上的工具多种多样&#xff0c;贝格前端工场先介绍一下什么是前端工程化&#xff0c;为什么要前端工程化&#xff0c;以及常用工具&#xff0c;后面会对各种工具逐一介绍。 一、什么是…