Android性能优化-内存优化

news2024/11/15 19:27:44

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;

    @override
    protected 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.coloradmin.cn/o/1858002.html

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

相关文章

【日常开发之Windows共享文件】Java实现Windows共享文件上传下载

文章目录 Windows 配置代码部分Maven代码 Windows 配置 首先开启服务&#xff0c;打开控制面板点击程序 点击启用或关闭Windows功能 SMB1.0选中红框内的 我这边是专门创建了一个用户 创建一个文件夹然后点击属性界面&#xff0c;点击共享 下拉框选择你选择的用户点击添加…

自建消息推送工具 Gotify 实现消息私有化通知

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 之前分享了如何通过 Webhook 将 VPS 与 NAS 上部署的应用消息推送到钉钉、飞书、企业微信,但是对于部分用户来说,可能因为以下种种原因,不方便使用常见的办公 IM 软件来进行消息推送: 消息涉及隐私敏感信息,不希…

艺术签名生成工具哪个好?5个工具定制个性化签名

在追求个性化的现代社会&#xff0c;艺术签名已经成为一种时尚和趋势&#xff0c;越来越多的人开始关注和尝试学习如何设计自己的艺术签名。 这不仅是一种表达自我的方式&#xff0c;也是一种展现个性和独特性的方式。今天让我们一起探索5款艺术签名在线生成工具&#xff0c;让…

【高性能计算笔记】

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

百度Agent初体验(制作步骤+感想)

现在AI Agent很火&#xff0c;最近注册了一个百度Agent体验了一下&#xff0c;并做了个小实验&#xff0c;拿它和零一万物&#xff08;Yi Large&#xff09;和文心一言&#xff08;ERNIE-4.0-8K-latest&#xff09;阅读了相同的一篇网页资讯&#xff0c;输出资讯摘要&#xff0…

shell的正则表达------awk

一、awk&#xff1a;按行取列 1.awk原理&#xff1a;根据指令信息&#xff0c;逐行的读取文本内容&#xff0c;然后按照条件进行格式化输出。 2.awk默认分隔符&#xff1a;空格、tab键&#xff0c;把多个空格自动压缩成一个。 3.awk的选项&#xff1a; awk ‘操作符 {动作}’…

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

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

不同匿名程度的代理本质区别是什么?

区别主要在于匿名的程度不同&#xff0c;就看你自己对匿名要求高不高了。 有三种主要代理类型&#xff1a; 1、透明代理 透明代理的特点就是不提供匿名性&#xff0c;你用它的时候网站是可以直接读取到你的真实IP地址的&#xff0c;需要提供的就可以直接排除它了。 2、匿名…

JVM专题八:JVM如何判断可回收对象

在JVM专题七&#xff1a;JVM垃圾回收机制中提到JVM的垃圾回收机制是一个自动化的后台进程&#xff0c;它通过周期性地检查和回收不可达的对象&#xff08;垃圾&#xff09;&#xff0c;帮助管理内存资源&#xff0c;确保应用程序的高效运行。今天就让我们来看看JVM到底是怎么定…

Shopee API接口:获取搜索栏生成的商品结果列表

一、引言 此接口可以高效获取搜索栏生成的商品结果列表。本文将详细介绍这一核心功能&#xff0c;并探讨其在实际应用中的价值。 二、核心功能介绍——获取搜索栏生成的商品结果列表 请求API及返回示例 http://api.xxxx.com/sp/ll/search/item?keywordiphone&page1&am…

零门槛用AI,302.AI让人工智能变得简单易用

当下人工智能火爆&#xff0c;提到AI&#xff0c;几乎每个人都能说上几句&#xff0c;但是你真的会使用AI吗&#xff1f; 当涉及到如何实际使用AI时&#xff0c;许多人可能会觉得它太过高深莫测&#xff0c;从而产生一种距离感&#xff0c;不知如何开始。我和大家也一样&#x…

期末考试的成绩怎么发?

随着学期末的临近&#xff0c;我们又迎来了向家长通报学生成绩的关键时刻。下面是一份成绩群发的全新指南&#xff0c;让我们一起高效而温馨地完成这项任务&#xff01; 1.选择沟通渠道&#xff1a; - 邮件与短信各有优势。邮件更适合提供详尽的成绩分析和评语&#xff0c;而短…

云计算【第一阶段(18)】磁盘管理与文件系统 分区格式挂载(一)

目录 一、磁盘基础 二、磁盘结构 2.1、机械硬盘 2.2、固态硬盘 2.3、扩展移动硬盘 2.4、机械磁盘的一些计算&#xff08;了解&#xff09; 2.5、磁盘接口类型 二、Linux 中使用的文件系统类型 2.1、磁盘分区的表示 2.1.1、主引导记录(MBR) 2.1.2、Linux中将硬盘、分…

【UIDynamic-动力学-UIPushBehavior-推行为 Objective-C语言】

一、接下来,我们来说这个,推行为, 1.推行为,首先,它叫做UIPushBehavior, 这个里边呢,又分为持续推力、瞬时推力, 我们新建一个项目,叫做:13-推行为 我们这个里边,还是先来一个redView, UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(100,100,…

二刷算法训练营Day41 (Day40休息) | 动态规划(3/17)

目录 详细布置&#xff1a; 1. 背包问题理论基础 1.1 01背包 2. 46. 携带研究材料&#xff08;第六期模拟笔试&#xff09; 一维dp数组&#xff08;滚动数组&#xff09; 3. 416. 分割等和子集 详细布置&#xff1a; 1. 背包问题理论基础 但说实话&#xff0c;背包九讲…

ONLYOFFICE 8.1全新升级,智能办公体验再升级,引领未来工作新潮流!

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ONLYOFFICE 8.1 &#x1f4d2;1. ONLYOFFICE简介&#x1f4d9;2. ONLYOFFICE特点&#x1f4d5;3. ONLYOFFICE功能⛰️PDF 文件编辑器&#x1…

win10系统管理员账号怎么切换

1、按住“windowsx”&#xff0c;选择“计算机管理” 2、在页面左侧&#xff0c;找到“计算机管理(本地)”&#xff0c;展开“系统工具”&#xff0c;点击“本地用户和组”下面的“用户”&#xff0c;在右侧找到“Administrator”&#xff0c;双击打开。 3、在打开页面选择常规…

【分布式事务】Seata AT实战

目录 Seata 介绍 Seata 术语 Seata AT 模式 介绍 实战&#xff08;nacos注册中心&#xff0c;db存储&#xff09; 部署 Seata 实现 RM 实现 TM 可能遇到的问题 1. Seata 部署成功&#xff0c;服务启动成功&#xff0c;全局事务不生效 2. 服务启动报错 can not get …

Windows安装jdk配置环境变量(基础)

一、下载安装JDK 下载地址:https://www.oracle.com/java/technologies/downloads/?er=221886#java8-windows 因为JDK8比较稳定,所以建议选择这个。电脑32位的下载jdk-8u411-windows-i586.exe;电脑是64位的下载jdk-8u411-windows-x64.exe 1、根据自己电脑的配置下载相应的…

C++使用Poco库封装一个FTP客户端类

0x00 Poco库中 Poco::Net::FTPClientSession Poco库中FTP客户端类是 Poco::Net::FTPClientSession , 该类的接口比较简单。 上传文件接口&#xff1a; beginUpload() , endUpload() 下载文件接口&#xff1a; beginDownload() , endDownload() 0x01 FTPCli类说明 FTPCli类…