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.rhkb.cn/news/359452.html

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

相关文章

计算机网络 —— 应用层(DHCP)

计算机网络 —— 应用层&#xff08;DHCP&#xff09; 什么是DHCPDHCP工作过程DHCP DISCOVERDHCP OFFERDHCP RQUESTDHCP ACK DHCP租约机制中继代理工作原理功能与优势 我们今天来计网的DHCP&#xff1a; 什么是DHCP DHCP&#xff08;Dynamic Host Configuration Protocol&…

利用Python爬取天气数据并实现数据可视化,一个完整的Python项目案例讲解

要使用Python爬取天气数据并进行制图分析分几个步骤进行&#xff1a; 选择数据源&#xff1a;首先&#xff0c;你需要找到一个提供天气数据的API或网站。一些常见的选择包括&#xff1a;OpenWeatherMap、Weatherbit、Weather Underground等。 安装必要的库&#xff1a;你需要安…

CPsyCoun:心理咨询多轮对话自动构建及评估方法

CPsyCoun: A Report-based Multi-turn Dialogue Reconstruction and Evaluation Framework for Chinese Psychological Counseling 在大模型应用于心理咨询领域&#xff0c;目前开源的项目有&#xff1a; https://github.com/SmartFlowAI/EmoLLM &#xff08;集合&#xff0c;…

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

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

【投稿优惠|权威主办】2024年图像、地质测绘与遥感技术国际学术会议(ICIGSRST 2024)

【投稿优惠|权威主办】2024年图像、地质测绘与遥感技术国际学术会议&#xff08;ICIGSRST 2024&#xff09; 2024 International Conference on Image, Geological Surveying and Remote Sensing Technology&#xff08;ICIGSRST 2024&#xff09; ▶会议简介 2024年图像、地质…

【总线】AXI4第五课时:信号描述

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

实用软件下载:CrossOver 2024最新安装包及详细安装教程

​根据软件大数据显示上传或者手动输入软件都非常简单&#xff0c;一般来说CrossOver会自动连接到一个Win文件共享服务器&#xff08;Samba或CIFS&#xff09;上&#xff0c;使用者能够直接在这个服务器中选择并上传软件执行文件。实际上我们可以这样讲调整CrossOver设置&#…

JBPM4 JBDL Demo

JBPM4 JBDL Demo 工作流样例&#xff0c;工作流程定义文件

【高性能计算笔记】

第1章 - 高性能计算介绍 1. 概念&#xff1a; 高性能计算(High performance computing&#xff0c;缩写HPC)&#xff1a; 指通常使用很多处理器&#xff08;作为单个机器的一部分&#xff09;或者某一集群中组织的几台计算机&#xff08;作为单个计算资源操作&#xff09;的…

比特币今天下跌2,800美元,共有$2.824 亿合约爆仓

来源:币界原创 作者:636Marx 币界网报道&#xff0c;截止0624-18:20分&#xff0c;全网共有 90,966 交易账户爆仓&#xff0c;清算金额达 2.824 亿美元。本月累计下跌-10.10%&#xff0c;约 -7,500美元。 图片来自币界网&#xff0c;了解更新资讯 今日爆仓大部分是多头仓位&am…

(一)、配置服务器的多个网卡路由,访问多个不同网络段

一、现场网络关系说明 有这么一个需要&#xff0c;服务器有三个网口&#xff0c;网口一需要访问外网&#xff0c;网口二需要访问内网1&#xff0c;网口2需要访问内网2。需要配置路由来满足该网络访问需要。 图1 现场网络关系 二、配置教程 步骤1&#xff1a; a、命令行输入…

若依-前后端分离项目学习

第一天&#xff08;6.24&#xff09; 具体参考视频 b站 楠哥教你学Java 【【开源项目学习】若依前后端分离版&#xff0c;通俗易懂&#xff0c;快速上手】 https://www.bilibili.com/video/BV1HT4y1d7oA/?share_sourcecopy_web&vd_sourcecd9334b72b49da3614a4257…

vue项目中dom拖动排序功能实现

vue项目中拖动元素改变其顺序的功能实现 实现此功能&#xff0c;我利用的是SortableJs,其官网上直接介绍其为功能强大的js拖拽库&#xff0c;只需要简单的代码即可实现dom拖拽 1.下载 npm i sortablejs 2.引入 使用时&#xff0c;我们在那个页面中使用&#xff0c;就在该vue文…

oracle报错-ORA-12638:身份证明检索失败

navicat16连接本地oracle数据库成功后&#xff0c;连接远程数据库&#xff0c;同样是oracle11g&#xff0c;确认网络、用户名、密码都没问题的情况下&#xff0c;报错ora-12638。 解决方法&#xff1a; 这是由于Oracle的认证方式使用了本地操作系统认证&#xff08;NTS&#x…

Redis 主从复制+哨兵+集群

1、总结写在前面 Redis 集群 数据分片 高可用性 Redis 哨兵 主从复制 故障转移 2、主从复制 2.1、准备配置 查看docker 容器 ip docker inspect 容器id | grep IPAddressdocker inspect -f{{.Name}} {{.NetworkSettings.IPAddress}} $(docker ps -aq)修改配置文件 初始…

从广州到上海|荣载光的智慧 与SSHT共同探索智能照明更多想象空间

随着生活水平的提高&#xff0c;大众对高品质生活的追求脚步逐步加快&#xff0c;人们对智能照明的需求日益多样化&#xff0c;不再仅仅满足于传统的照明功能&#xff0c;而是转向智能照明系统&#xff0c;提出更高的需求。 展望未来&#xff0c;中国智能照明市场预计将迎来全…

泽众云真机-平台即将升级支持华为机型HarmonyOS NEXT系统

具小编了解&#xff0c;泽众云真机即将升级支持华为机型HarmonyOS NEXT系统。有些人可能对HarmonyOS NEXT系统了解不多。 之前我们有个银行项目&#xff0c;客户要求测试华为HarmonyOS NEXT系统环境&#xff0c;当时我们云真机尚未有该系统的机型&#xff0c;然后技术人员向华为…

SpringBoot + Vue 实现 AES 加密和 AES 工具类总结

目录 一、加密知识回顾 AES加密模式 二、Java 自定义 AES 工具类 三、SpringBoot 实现 AES 加密登陆 controller 层 server 层 四、Vue 实现 AES 加密登陆 五、前端AES工具类 六、实现结果 一、加密知识回顾 密钥是AES算法实现加密和解密的根本。对称加密算法之所以…

最新SCI算法:常青藤优化算法(IVY)原理及应用 Python代码

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类算法的家人&#xff0c;可关注我的VX公众号&#xff1a;python算法小当家&#xff0c;不定期会有很多免费代码分享~ 最新SCI算法&#xff1a;常青藤优化算法&#xff08;IVY&…

浏览器提升编译速度小技巧(一)- 防病毒排除

1.引言 在Chrome开发过程中&#xff0c;编译速度是影响开发效率的关键因素之一。编译一个大型项目如Chrome&#xff0c;往往需要处理大量的代码文件和依赖库&#xff0c;这个过程既复杂又耗时。因此&#xff0c;任何能够提升编译速度的技巧&#xff0c;都能显著提高开发效率&a…