Android性能优化-内存优化

1、为什么进行内存优化(如果不进行内存优化)

APP运营内存限制,OOM导致APP崩溃
APP性能,流畅性,响应速度和体验

2、Android内存管理方式:

Android系统内存分配与回收方式
APP内存限制机制
切换应用时,后台APP清理机制
监控内存的几种方法演示

2.1 Android系统内存分配与回收方式

相关命令行:
ps,查看进程pid,ppid,启动的进程,init->zygote->remusic
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看:dumpsys meminfo com.wm.remusic在这里插入图片描述

pss物理内存
Heap堆的尺寸
NativeHeap相当于JNI开发方式下 XX空间下的堆
DalvikHeap虚拟内存
堆栈
共享内存
apk占用内存

直观看到一个APP通常就是一个进程对称一个虚拟机
GC只在Heap剩余空间不够时才触发垃圾回收,释放空间。
GC触发时,所有县城都是会被暂停,所以会存在内存抖动

2.2 APP内存限制机制

每个APP分配的最大内存限制,随不同设备而不同
吃内存大户:图片
我什么要限制?因为是多任务系统,需要协作运行

2.3切换应用时,后台APP清理机制

分时复用
APP切换时使用LRU Cache
onTrimMemory()回调方法,及时释放不需要的内存,减小app占用内存,减少系统清理app的可能性
在这里插入图片描述

2.4 监控内存的几种方法演示

AS代码

private void calculate() {StringBuilder strBuilder =new StringBuilder();ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);int memClass =activityManager.getMemoryClass();//m为单位int largeMemClass=activityManager.getLargeMemoryClass();//以m为单位strBuilder.append("memClass:"+ memClass + "\n");strBuilder.append("largememClass:"+ largeMemClass + "\n");Float totalMemory=Runtime.getRuntime().totalMemory()*1.0f /(1024*1024);Float freelemory =Runtime.getRuntime().freeMemory()*1.0f /(1024*1024);Float maxlemory=Runtime.getRuntime().maxMemory()*1.0f /(1024*1024);info.setText(strBuilder.toString());Log.d("打印内存", strBuilder.toString());
}

AS自带内存监控工具:
在这里插入图片描述
在这里插入图片描述

3、APP内存优化方法

数据结构
对象复用
内存泄漏
相关演示

3.1 数据结构优化

1、频繁字符串拼接用StringBuilder,效率和耗时对比StringBuild更好
2、ArrayMap, SparseArray替换HashMap
3、内存抖动:突然间申请很多变量和空间后再释放,且GC时所有进程会暂停,重复此行为。
例如:优化方案:将变量strlatrix放在循环外

private void doChurn(){Log.d("mooc", "doChurn start:");for(int i=0; i< rowlength; i++) {String[] strlatrix = new String[length];   // 主要在这里,不停的重新申请变量for(int j=0;j< length; j++) {strlatrix[j]= String.value0f(ran.nextDouble());   //使用后,释放空间,造成不停的申请、释放大量空间,引起抖动}Log.d("mooc", "doChurn rowStr:"+i);}Log. d("mooc","doChurn rowStr end:");
}

// 优化方案:将变量strlatrix放在循环外
4、再小的Class耗费0.5KB
5、HashMap的一个entry需要额外占用32B

3.2 对象复用

复用系统自带的资源;
ListView、GrideView的ConvertView的复用,recycleView的适配器也可复用,等等等;
避免在onDraw方法里面执行对象的创建,onDraw界面,图像,view有变动,则会重新执行onDraw,如果在里面进行对象创建,则会影响绘制时间,如果onDraw绘制时间较长,则会引起UI卡顿,且onDraw频繁执行,创建也会频繁执行;

3.3内存泄漏

内存泄漏:代码有瑕疵,导致内存停止不用,但被其他变量引用,导致GC无法回收。
导致剩余可用Heap越来越少,频繁触发GC;
典型例子:在一个activity中有一个比较耗时的线程,当推出activity时,线程依然在执行,无法回收内存,导致了内存泄漏;
建议:用Application Context而不是用Activity Context;
注意Cursor对象是否及时关闭;

4、OOM(内存溢出)问题优化

问题分析
强引用、软引用的意义
优化OOM问题方法

4.1 OOM问题分析

OOM必然性与可解决性
OOM绝大部分发生在图片

4.2 强引用、软引用

public class Gate extends AppCompatActivityprivate {private String strongref;private SoftReference<String> softref;@overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.gate);strongref = String.valueOf(Math.random());  // 在生命周期中,不会被回收softref=new SoftReference(String.valueOf(Math.random()));  //在生命周期中,内存不够会被回收...}
}

4.3 onTrimMemory内存变换情况:

ComponentCallbacks2  |  Android Developers (google.cn)
The values provided by onTrimMemory(int) do not represent a single linear progression of memory limits, but provide you different types of clues about memory availability:
- When your app is running:
a.TRIM_MEMORY_RUNNING_MODERATE        
b.TRIM_MEMORY_RUNNING_LOW
c.TRIM_MEMORY_RUNNING_CRITICAL
- When your app's visibility changes:
a.TRIM_MEMORY_UI_HIDDEN
- When your app's process resides in the background LRU list:
a.TRIM_MEMORY_BACKGROUND
b.TRIM_MEMORY_MODERATE
c.TRIM_MEMORY_COMPLETE
To support API levels lower than 14, you can use the ComponentCallbacks.onLowMemory() method as a fallback that's roughly equivalent to the ComponentCallbacks2#TRIM_MEMORY_COMPLETE level.

4.4 优化OOM问题方法

注意临时Bitmap对象的及时回收,调用recycle();
避免Bitmap的浪费;
TryCatch某些大内存分配操作;
加载Bitmap:缩放比例,解码格式,局部加载;
代码:暂时不写。

走过路过,麻烦关注下微信公众号,不胜感激~
微信公众号链接: Android性能优化-内存优化
我的公众号二维码

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

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

相关文章

AGV选型要点及步骤,保证企业选择的AGV小车更实用

AGV AGV小车作为智能化物流仓储不可或缺的工具&#xff0c;在制造业得到了广泛的应用&#xff0c;市场需求呈现出井喷式增长。但是AGV市场还存在着很多问题&#xff0c;制造企业在产品选型时往往缺乏正确的引导。 AGV智能仓储 毫无疑问,我们的自动化物流系统已离不开AGV小车了,…

链在一起Chained Together没中文 超好用的一键汉化工具推荐

《链在一起》一款新的可联机冒险跑酷类游戏&#xff0c;游戏里玩家将与你的同伴被链在一起&#xff0c;然后开始你的旅程&#xff0c;在地狱的深处&#xff0c;任务是通过尽可能高的攀登逃离地狱。 每一次跳跃都需要完美的协调才能攀上平台并逃离灼热&#xff0c;穿越众多世界&…

服务器win10server,python安装paddleocr的踩坑日记

最近由于需要图像文字识别的简单业务&#xff0c;研究了一下&#xff0c;一是用大厂的文字识别api&#xff0c;如百度腾讯等&#xff0c;但这种免费版只有有限的调用次数&#xff0c;如百度只有每月只有1000次调用额度&#xff0c;个人也够用&#xff0c;但由于业务量大&#x…

深入测评:ONLYOFFICE 8.1 桌面编辑器究竟有多强大?

ONLYOFFICE 8.1桌面编辑器 文章目录 ONLYOFFICE 8.1桌面编辑器一、ONLYOFFICE的简介二、ONLYOFFICE 8.1新功能和改进2.1 轻松编辑器 PDF 文件2.2 用幻灯片版式快速修改幻灯片2.3 无缝切换文档编辑、审阅和查看模式2.4 改进从右至左语言的支持 & 新的本地化选项2.5 隐藏“连…

【权威发布】2024年文化、设计与社会科学国际会议(ICCDSS 2024)

2024年文化、设计与社会科学国际会议 2024 International Conference on Culture, Design, and Social Sciences 会议简介 2024年文化、设计与社会科学国际会议旨在为全球范围内的专家学者提供一个交流文化、设计与社会科学研究成果的平台。会议将围绕文化、设计与社会科学的前…

超越AnimateAnyone, 华中科大中科大阿里提出Unimate,可以根据单张图片和姿势指导生成视频。

阿里新发布的UniAnimate&#xff0c;与 AnimateAnyone 非常相似&#xff0c;它可以根据单张图片和姿势指导生成视频。项目核心技术是统一视频扩散模型&#xff0c;通过将参考图像和估计视频内容嵌入到共享特征空间&#xff0c;实现外观和动作的同步。 相关链接 项目&#xff1…

Scala入门【安装与使用、变量与数据类型、运算符、函数、条件判断、循环、字符串、面向对象、数组】

视频地址:Scala大专/本科专用课程_哔哩哔哩_bilibili 目录 P01【01Scala安装与使用】16:15 P02【02变量与数据类型】17:14 P03【03运算符】12:41 P04【04函数】16:40 P05【05条件判断】10:56 P06【06循环】13:33 P07【07字符串】19:09 P08【08面向对象】17:27 P09【0…

DVWA-CSRF-samesite分析

拿DVWA的CSRF为例子 接DVWA的分析&#xff0c;发现其实Impossible的PHPSESSID是设置的samesite1. 参数的意思参考Set-Cookie SameSite:控制 cookie 是否随跨站请求一起发送&#xff0c;这样可以在一定程度上防范跨站请求伪造攻击&#xff08;CSRF&#xff09;。 下面用DVWA CS…

使用Python进行数据分析和自动化

组织严重依赖数据分析和自动化来提高运营效率。在本文中&#xff0c;我们将使用 Python&#xff08;一种用于通用编程的高级编程语言&#xff09;的示例来研究数据分析和自动化的基础知识。 什么是数据分析&#xff1f; 数据分析是指检查、清理、转换和建模数据的过程&#xf…

FydeOS导入VMware虚拟机之后,如何扩展系统硬盘大小?

前言​ 最近查询FydeOS系统的小伙伴不在少数啊&#xff01;可见这个系统是相当nice的&#xff0c;小伙伴们都是尝试尝试。 看到有不少小伙伴通过VMware虚拟机使用FydeOS&#xff0c;那么你就肯定知道官方包导入VMware之后&#xff0c;硬盘只显示分区了20GB。 如果这时候使用Fy…

物理服务器会不会被DDOS攻击?

物理服务器同样可能遭受分布式拒绝服务&#xff08;DDoS&#xff09;攻击。DDoS攻击的目的是通过大量的请求淹没目标服务器或网络&#xff0c;使其无法处理合法用户的请求&#xff0c;从而导致服务不可用。这种攻击并不区分服务器是物理的还是虚拟的&#xff0c;只要服务器连接…

同城跑腿小程序的崛起与用户体验革新

随着移动互联网的飞速发展&#xff0c;人们的生活方式正在发生深刻的变化。在这个快节奏的时代&#xff0c;时间成为了最宝贵的资源。在这样的背景下&#xff0c;同城跑腿小程序应运而生&#xff0c;以其高效、便捷的服务特性&#xff0c;迅速赢得了广大用户的青睐。本文将探讨…

puppet运维自动化

在现代信息技术管理中&#xff0c;自动化运维工具的应用已成为企业提升效率、降低成本的关键手段之一。Puppet作为一种强大的运维自动化工具&#xff0c;因其高效、灵活和可扩展的特点&#xff0c;受到越来越多企业的青睐。本文将探讨Puppet在运维自动化中的应用&#xff0c;包…

SpringBoot使用滑动窗口限流防止用户重复提交(自定义注解实现)

在你的项目中&#xff0c;有没有遇到用户重复提交的场景&#xff0c;即当用户因为网络延迟等情况把已经提交过一次的东西再次进行了提价&#xff0c;本篇文章将向各位介绍使用滑动窗口限流的方式来防止用户重复提交&#xff0c;并通过我们的自定义注解来进行封装功能。 首先&a…

代码随想录算法训练营第三十三天|452. 用最少数量的箭引爆气球、 435. 无重叠区间、 763.划分字母区间

452. 用最少数量的箭引爆气球 题目链接&#xff1a;452. 用最少数量的箭引爆气球 文档讲解&#xff1a;代码随想录 状态&#xff1a;没想出来 思路&#xff1a;对气球终点位置排序&#xff0c;从第一个气球终点位置射出箭&#xff0c;看这支箭可以尽可能穿过几个气球&#xff0…

Excel 宏录制与VBA编程 —— 12、日期相关

代码1 - 获取当前时间日期信息 代码2 - 时间日期格式 代码3 - 时间日期计算 代码4 - 时间日期案例 关注 笔者 - jxd

免费悬浮翻译器哪个好?测评5款悬浮翻译器

在享受休闲时光时&#xff0c;我们通常都希望不被打扰&#xff0c;对吧&#xff1f; 然而&#xff0c;有时打扰我们的并非是外界的干扰&#xff0c;而是在观看外语视频时&#xff0c;无法理解视频内容的烦躁感。 不过&#xff0c;今天本文将为大家揭开几款屏幕悬浮翻译软件的…

基于Java协同过滤算法的图书推荐系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

ctr/cvr预估之WideDeep模型

ctr/cvr预估之Wide&Deep模型 在探索点击率&#xff08;CTR&#xff09;和转化率&#xff08;CVR&#xff09;预估的领域中&#xff0c;我们始终追求的是一种既能捕获数据中的线性关系&#xff0c;又能发现复杂模式的模型。因子分解机&#xff08;Factorization Machines, …

微服务SpringCloud,SpringAliBaBa(2)

微服务02 1.网关路由 网络的关口&#xff0c;负责请求的路由、转发、身份校验。 有了网关之后&#xff0c;微服务的地址不用在暴露了&#xff0c;就暴露个网关地址。 快速入门 routes代表一套路由&#xff0c;pridicates是规则&#xff0c;对请求做出判断&#xff0c;看是哪…