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

news/2024/9/11 4:20:05/ 标签: android, java, linux

一 测试目标:
以满足用户设备的内存性能和不杀后台为目标。
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.ppmy.cn/news/1474497.html

相关文章

从科幻到现实,IOC如何驱动智慧城市“数字孪生”变革?

每天&#xff0c;世界各地的城市都面临着各种突发事件&#xff0c;这些事件要求跨部门和机构的实时通信及协作。遗憾的是&#xff0c;关键信息通常存储在多个分散的系统中&#xff0c;这阻碍了状况认知&#xff0c;并让各个部门难以协调其响应工作。如果没有单个集成的危机视图…

线程池操作数据库存在线程安全问题

目录 1、前言 2、问题 3、解决方法 3.1、方法一&#xff1a;数据库约束 3.2、方法二&#xff1a;使用锁进行线程的约束 4、总结 1、前言 当前需求为&#xff1a;处理数据&#xff0c;将数据存储到数据库中&#xff0c;在存储的过程中&#xff0c;会先查询该数据是否已经存…

FPGA(1)--什么是布局与布线

布局与布线是FPGA设计流程中非常关键的步骤&#xff0c;它们的目的是将经过综合的逻辑网表映射到FPGA芯片的物理资源上&#xff0c;并通过电气连接来实现设计的功能。具体来说&#xff0c;布局与布线包括以下工作&#xff1a; 布局&#xff08;Placement&#xff09;&#xff1…

9.Python学习:Socket

1.网络通信要素&#xff08;IP端口传输协议&#xff09; 2.Socket编程 2.1TCP、UDP协议了解 2.2 Socket流程 服务端有两个socket对象&#xff0c;客户端有一个 3.Socket实战 服务端代码&#xff1a; import socket #创建Socket对象 sksocket.socket() #绑定ip与端口号-使…

BUG解决:postman可以请求成功,但Python requests请求报403

目录 问题背景 问题定位 问题解决 问题背景 使用Python的requests库对接物联数据的接口之前一直正常运行&#xff0c;昨天突然请求不通了&#xff0c;通过进一步验证发现凡是使用代码调用接口就不通&#xff0c;而使用postman就能调通&#xff0c;请求参数啥的都没变。 接口…

day30--56. 合并区间+ 738.单调递增的数字

一、56. 合并区间 题目链接&#xff1a;https://leetcode.cn/problems/merge-intervals/ 文章讲解&#xff1a;https://programmercarl.com/0056.%E5%90%88%E5%B9%B6%E5%8C%BA%E9%97%B4.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1wx4y157nD 1.1 初见思路 …

防火墙第一次综合实验

DMZ区内的服务器&#xff0c;办公区仅能在办公时间内(9:00-18:00)可以访问&#xff0c;生产区的设备全天可以访问。 办公区设备10.8.2.1不允许访问DMZ区的FTP服务器和HTTP服务器&#xff0c;仅能ping通10.0.3.10 1.先建立拒绝BG到DMZ区的安全策略 2.建立BG到DMZ区的icmp允许 3…

AI推介-大语言模型LLMs之RAG(检索增强生成)论文速览(arXiv方向):2024.06.01-2024.06.20

文章目录&#xff5e; 1.StackRAG Agent: Improving Developer Answers with Retrieval-Augmented Generation2.FoRAG: Factuality-optimized Retrieval Augmented Generation for Web-enhanced Long-form Question Answering3.Model Internals-based Answer Attribution for T…

springboot仓库管理系统+lw+源码+讲解+调试

第3章 系统分析 在进行系统分析之前&#xff0c;需要从网络上或者是图书馆的开发类书籍中收集大量的资料&#xff0c;因为这个环节也是帮助即将开发的程序软件制定一套最优的方案&#xff0c;一旦确定了程序软件需要具备的功能&#xff0c;就意味着接下来的工作和任务都是围绕…

vue项目实现路由按需加载(路由懒加载)的三种方式

使用异步组件 在使用vue-router配置路由时&#xff0c;可以使用异步组件来实现路由的按需加载。异步组件会在路由被访问时才进行加载&#xff0c;从而实现按需加载的效果。需要注意的是&#xff0c;使用异步组件需要借助webpack的动态import语法来实现。例如&#xff1a; cons…

java 公共字段填充

公共字段填充 1、mybatis-plus2、mybatis 使用注解加aop2.1 自定义注解2.2 自定义切面类2.3 在mapper上添加上自定义的注解 1、mybatis-plus 通过在类上使用如下的注解 TableField(fill FieldFill.INSERT) 是 MyBatis-Plus 中的注解&#xff0c;用于自动填充字段的值。MyBat…

动态规划算法-以中学排课管理系统为例

1.动态规划算法介绍 1.算法思路 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中&#xff0c;可能会有许多可行解。每一个解都对应于一个值&#xff0c;我们希望找到具有最优值的解。动态规划算法与分治法类似&#xff0c;其基本思想也是将待求解问题分解成若…

算法力扣刷题记录 四十【226.翻转二叉树】

前言 继续二叉树其余操作&#xff1a; 记录 四十【226.翻转二叉树】 一、题目阅读 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例…

three完全开源扩展案例02-跳动的音乐

更多案例尽在https://threelab.cn/ 演示地址 import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";let mediaElement; let analyser; let scene; let camera; let renderer; let controls; …

DOM(文档对象模型)生命周期事件

前言 DOM 生命周期事件涉及到从创建、更新到销毁 DOM 元素的不同阶段。 ● 我们来看下当HTML文档加载完再执行JavaScript代码 document.addEventListener(DOMContentLoaded, function (e) {console.log(HTML parsed adn DOM tree built!, e); })● 除此之外&#xff0c;浏览…

Electron 简单搭建项目

准备工作 全局安装 node npm创建文件夹&#xff0c;并执行 npm init安装 electron npm i electron --save-dev在 package.json 配置文件中的scripts字段下增加一条start命令&#xff1a; {"scripts": {"start": "electron ."} }由于配置中的入…

Day05-组织架构-角色管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.组织架构-编辑部门-弹出层获取数据2.组织架构-编辑部门-编辑表单校验3.组织架构-编辑部门-确认取消4.组织架构-删除部门5.角色管理-搭建页面结构6.角色管理-获取数…

STM32智能机器人导航系统教程

目录 引言环境准备智能机器人导航系统基础代码实现&#xff1a;实现智能机器人导航系统 4.1 数据采集模块 4.2 数据处理与导航算法 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;机器人导航应用与优化问题解决方案与优化收尾与总结 1. 引言 智能机器…

【LeetCode】面试题 16.21. 交换和

质量还不错的一道题&#xff0c;适合用于考察二分法。 1. 题目 2. 分析 求出两个数组的总和&#xff0c;我们令总和少的为less&#xff0c;总和多的为more&#xff1b;如果两个数组的总和是奇数&#xff0c;那么怎么都配不平&#xff0c;直接返回false&#xff1b;如果两个数…

冒泡排序与其C语言通用连续类型排序代码

冒泡排序与其C语言通用连续类型排序代码 冒泡排序冒泡排序为交换排序的一种&#xff1a;动图展示&#xff1a;冒泡排序的特性总结&#xff1a;冒泡排序排整型数据参考代码&#xff08;VS2022C语言环境&#xff09;&#xff1a; 冒泡排序C语言通用连续类型排序代码对比较的方式更…