初识Android内存优化

news2024/9/23 15:31:09

一、简介

Android 内存优化是指优化 Android 应用程序的内存使用,以减少可用内存的消耗,提高应用程序的性能和可靠性。Android 内存优化可以通过减少内存使用量,减少对资源的消耗,以及提高内存利用率来实现。

安卓系统对每个应用程序都有一定的内存限制,当应用程序的内存超过了上限,就会出现 OOM (Out of Memory),也就是 App 的异常退出。因此,要改善系统的运行效率、改善用户体验、降低系统资源占用、延长电池寿命、降低系统故障的危险。Android 通过内存优化,可以减少系统内存使用,让系统更加流畅,运行更快,减少系统 Crash,提升用户体验。

二、内存优化

对于 Android 内存优化可以细分为 RAM 和 ROM 两个维度

RAM 优化

主要是降低运行时内存,RAM 优化目的有以下三个:
防止应用发生 OOM。
降低应用由于内存过大被 LMK 机制杀死的概率。
避免不合理使用内存导致 GC 次数增多,从而导致应用发生卡顿。

ROM 优化

减少程序占用的 ROM,并进行 APK 精简。其目标是减少应用程序的占用,防止由于 ROM 空间限制而导致程序的安装失败。

做好内存优化将带来以下三点好处:

第一点好处是减少 OOM,提高应用稳定性。
第二点好处是减少卡顿,提高应用流畅度。
第三点好处是减少内存占用,提高应用后台运行时的存活率。

三、内存痛点

内存痛点问题通常来说,可以细分为如下三类:
第一,内存抖动。
第二,内存泄漏。
第三,内存溢出。

内存抖动

内存波动图形呈锯齿状、GC 导致卡顿。内存抖动在 Dalvik 虚拟机上更明显,因为 ART 虚拟机内存管理、回收策略做了优化,所以内存分配、GC 效率提升了 5~10 倍,内存抖动发生概率小。
在这里插入图片描述

当内存频繁分配和回收导致内存不稳定,出现内存抖动,内存抖动通常表现为频繁 GC、内存曲线呈锯齿状。并且,内存抖动的危害严重,会导致页面卡顿,甚至 OOM。

这里假设有这样一个场景:点击按钮使用 Handler 发送空消息,Handler 的 handleMessage 方法接收到消息后会导致内存抖动。

for 循环创建 100 个容量为 10w+的 string[]数组在 30ms 后继续发送空消息。使用 MemoryProfiler 结合代码可找到内存抖动出现的地方。查看循环或频繁调用的地方即可。

public class MainActivity extends AppCompatActivity {

    private Button mButton;
    private Handler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mButton = (Button) findViewById(R.id.button);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mHandler.sendEmptyMessage(0);
            }

        });

        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                for (int i = 0; i < 100; i++) {
                    String[] arr = new String[100000];
                }
                mHandler.sendEmptyMessageDelayed(0, 30);
            }
        };
    }
}

请注意,这个代码中的消息循环可能会导致内存泄漏,因此您需要在适当的时候删除消息。

内存泄漏

Android 系统虚拟机的垃圾回收是通过虚拟机 GC 机制来实现的。GC 会选择一些还存活的对象作为内存遍历的根节点 GC Roots,通过对 GC Roots 的可达性来判断是否需要回收。

内存泄漏是在当前应用周期内不再使用的对象被 GC Roots 引用,导致不能回收,使实际可使用内存变小。

对象被持有导致无法释放或不能按照对象正常的生命周期进行释放,内存泄漏导致可用内存减少和频繁 GC,从而导致内存溢出,App 卡顿。

public class MainActivity extends AppCompatActivity {
    private List<Bitmap> bitmaps = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //不断加载图片并加入到List中
        while (true) {
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.large_image);
            bitmaps.add(bitmap);
        }
    }
}

在上面的代码中,每次加载图片并加入到List中都不会释放内存,因为List引用了这些图片,导致图片无法释放,最终造成内存溢出。为了避免内存溢出,你可以考虑使用低内存占用的图片格式,或者在不需要使用图片时主动调用recycle方法释放图片的内存。

内存溢出(OOM)

OOM 时会导致程序异常。Android 设备出厂以后,java 虚拟机对单个应用的最大内存分配就确定下来了,超出值就会 OOM。

单个应用可用的最大内存对应于 /system/build.prop 文件中的 dalvik.vm.heap growth limit。

此外,除了因内存泄漏累积到一定程度导致 OOM 的情况以外,也有一次性申请很多内存,比如说一次创建大的数组或者是载入大的文件如图片的时候会导致 OOM。而且,实际情况下很多 OOM 就是因图片处理不当而产生的。

public class MainActivity extends AppCompatActivity {
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = findViewById(R.id.image_view);
        
		// 试图创建大的数组
        int[] largeArray = new int[Integer.MAX_VALUE];
        
		// 或者试图载入大的图片
        Bitmap largeBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.large_image);
        
        imageView.setImageBitmap(largeBitmap);
    }
}

参考

  • 内存指的是什么?一文带你了解Android的内存优化

  • Android性能优化:手把手带你全面了解 内存泄露 & 解决方案

  • Android 虚拟机、对象、变量的内存分配

  • Android性能调优篇之探索JVM内存分配

  • Android 从内存模型深究内存优化本质

  • 深入理解Java虚拟机——Java内存区域

  • 内存优化 · 基础论 · 初识Android内存优化

  • Android内存优化深入解析

  • android studio profiler 内存分析用法【官网】

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

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

相关文章

【音视频第16天】详解STUN协议

一个webRTC传输协议搞得自己云里雾里的。现在主动攻克一下。先看看STUN协议。好&#xff0c;我们开始吧 目录 1.讲讲什么是NAT&#xff1f;2.NAT有啥问题&#xff1f;3.四种NAT类型4.STUN Server5.TURN ServerSTUN和TURN的实现&#xff1a;什么是STUN&#xff1f;为什么需要ST…

中台产品经理02:产品经理如何用一套方法搞定复杂业务拆解?

如果你问我作为企业级应用的产品经理日常工作最大的感受是什么&#xff1f;那就是经常会需要面对众多复杂类业务需求。 原因其实很好理解&#xff0c;B端产品通常需要支持更复杂的业务流程&#xff0c;需求也更加个性化和细分。例如&#xff0c;银行业务系统、医院管理系统、物…

JVM中的垃圾回收概念及其基础算法说明

文章目录 一、 垃圾回收概述1、什么是垃圾&#xff1f;2、为什么我们需要GC 二、垃圾回收之判别对象死活1、标记阶段&#xff1a;引用计数算法2、标记阶段&#xff1a;可达性分析算法 二、 finalization 机制三、整理和清除对象1、标记-清除算法&#xff08;Mark-Sweep&#xf…

Selenium安装及环境配置

目录 一、Selenium 简介1. 组件2. 特点 二、安装Selenium✨三、下载对应版本的Chromedriver1.查看Chrome的版本号2.下载驱动 chromedriver和配置3.解压到本地4.复制文件放入python安装目录的Scripts文件夹中5.Selenium启动Chrome 一、Selenium 简介 1. 组件 Selenium IDE&…

【Few Shot数据集】CUB-200-2011 鸟类

文章目录 一、数据下载二、数据介绍3.1 图案示意3.2 标注属性 CUA-200-2011 是CUB-200的拓展&#xff0c;包含了200个鸟类&#xff0c;共11788张图片&#xff0c;每张图片都标注了物体的框、关键点和属性类别&#xff0c;常被用于小样本细粒度图像分类或者检测任务中。 一、数据…

java运动会成绩管理系统dzkf0534程序

借助java编程语言、jsp技术、MySQL数据库和tomcat服务器来完成系统的所有功能&#xff0c;最后进行系统测试&#xff0c;来检测系统的权限和漏洞&#xff0c;从而将系统完善&#xff0c;达到符合标准。 &#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff…

数据库基础篇 《4. 运算符》

目录 1. 算术运算符 1&#xff0e;加法与减法运算符 2&#xff0e;乘法与除法运算符 3&#xff0e;求模&#xff08;求余&#xff09;运算符 2. 比较运算符 1&#xff0e;等号运算符 2&#xff0e;安全等于运算符 3&#xff0e;不等于运算符 4. 空运算符 5. 非空运算…

从三室心脏MRI影像检测主动脉瓣病变

Detecting Aortic Valve Pathology from the 3-Chamber Cine Cardiac MRI View 摘要 背景 心脏磁共振(CMR)是量化心脏容量、功能和血流量的金标准。定制的MR脉冲序列定义了对比机制&#xff0c;采集几何形状和定时&#xff0c;可以在CMR期间应用&#xff0c;以实现独特的组织…

进程间通信---管道

进程间通信 概念 进程间通信就是在不同进程之间传播或交换信息数据, 简称IPC&#xff08;Interprocess communication&#xff09;. 意义 数据传输, 资源共享事件通知, 进程控制 本质 让不同的进程看到同一份资源 管道 匿名管道 原理: 匿名管道仅限于本地父子进程之间的…

开放原子训练营(第三季)RT-Thread Nano学习营线下学习心得

前言 目前市面上有很多种RTOS&#xff08;Real-time operating system&#xff0c;实时操作系统&#xff09;&#xff0c;还在犹豫选择学习哪种RTOS的小伙伴&#xff0c;推荐你们学习RT-Thread操作系统&#xff0c;这也是本人最喜欢的一个RTOS&#xff0c;喜欢的原因很简单&am…

[chapter27][PyTorch][Overfitting under fitting]

前言&#xff1a; 机器学习模型性能度量标准之一&#xff1a; 泛化能力 泛化能力强的模型才是好的模型&#xff0c;在评价泛化能力 时候&#xff0c;我们经常遇到过拟合和欠拟合问题 目录&#xff1a; 1&#xff1a; Overfitting 2: underfitting 一 Overfitting refers …

Revit中如何制作一个台阶?

简易台阶制作&#xff0c;比绘制轴线复杂些&#xff0c;运用到的快捷键也比较多&#xff0c;因此需要多多操作&#xff0c;接下来我们就开始吧。 1、开始我们的第一步&#xff0c;此处我们首先新建一个族而不是项目。然后点击公制常规模型。 2、进入族后&#xff0c;我们可以看…

大孔树脂型号,A-722,ADS500,ADS600,ADS750,ADS800

一、产品介绍 基于吸附功能的聚苯乙烯特种树脂 Tulsimer ADS-600 是一款没有离子官能基的&#xff0c;由交联聚苯乙烯合成的功能强大的吸附型树脂。 Tulsimer ADS-600 主要应用于水溶液中吸附酚及其化合物&#xff0c;氯代烃等含氯物质&#xff0c;表面活性剂&#xff0…

苦中作乐 ---竞赛刷题41-50(15-20)

&#xff08;一&#xff09;目录 L1-043 阅览室 L1-044 稳赢 L1-046 整除光棍 L1-048 矩阵A乘以B L1-049 天梯赛座位分配 L1-050 倒数第N个字符串 &#xff08;二&#xff09;题目 L1-043 阅览室 天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时&…

MES管理系统助力数字化转型,实现智能化制造

MES管理系统不仅可以优化制造流程&#xff0c;还可以整合企业资源&#xff0c;从而提高企业效益。MES管理系统具有数据实时采集、数据分析与决策支持等功能&#xff0c;有利于企业管理层及时掌握生产运营情况&#xff0c;进行战略决策。 对于工厂&#xff0c;MES管理系统…

2023 IT市场权威榜单|美创数据库防火墙斩获“新一代信息技术创新产品”

4月20日&#xff0c;由赛迪顾问主办的“2023 IT市场权威榜单”评选结果正式发布&#xff0c;美创数据库防火墙斩获新一代信息技术创新产品&#xff01; 美创数据库防火墙是一款抵御并消除由于应用程序业务逻辑漏洞或者缺陷所导致的数据库安全问题的专业级数据库安全产品&#x…

【SVN】windows SVN安装使用教程(服务器4.3.4版本/客户端1.11.0版本)

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

什么是矩阵式项目管理?

矩阵式项目管理组织&#xff0c;是结构形式呈矩阵状的组织&#xff0c;项目管理人员由企业有关职能部门派出并进行业务指导&#xff0c;受项目经理的直接领导。对于任何从事多个技能要求相似或重叠的项目的企业来说&#xff0c;这是一个理想的策略。 矩阵组织如何运作&#xf…

Windows下版本控制器(SVN) - 1、开发中的实际问题+2、版本控制简介

文章目录 基础知识-Windows下版本控制器(SVN)1、开发中的实际问题2、版本控制简介2.1 版本控制[Revision control]2.2 Subversion2.3 Subversion 的优良特性2.4 SVN 的工作原理&#xff1a;2.5 SVN 基本操作 基础知识-Windows下版本控制器(SVN) 1、开发中的实际问题 小明负责…

虚拟机配置工作环境

一、安装cmake apt-get install cmake 二、配置JAVA环境 1、将这两个文件放入虚拟机文件系统中&#xff0c;拖进去即可 2、执行安装命令./ 3、拉代码svn rootmlw-virtual-machine:~/svnCode# svn --username wangmiaolin co https://10.200.20.20/svn/TIASDev/Devsrc/Branch…