当前位置: 首页 > news >正文

Android性能优化—— 内存优化

 Android 系统中,垃圾回收是自动的,比较隐蔽,这就导致一些内存问题表现的并不明显,出现问题后难以定位。常见的内存问题有内存泄漏、内存溢出(Out of Memory)、内存抖动等。

我们做内存优化的主要原因有以下几点:

降低 OOM 率,内存问题最常见的就是 OOM,申请的内存得不到释放就有可能造成 OOM;
减少卡顿, 在 Android 系统中造成卡顿的原因有很多,其中就有内存引起的卡顿。内存问题之所以会影响到界面流畅度,是因为垃圾回收机制,在 GC 的时候,所有的线程都要停止工作,包括主线程。因此,当 GC 和绘制界面的操作同时触发时,绘制的任务就会被搁置,导致掉帧,也就是界面卡顿;
增加应用存活时间,Android 系统会按照特定的流程清理进程,优先考虑清理后台进程,如果某个应用在后台运行且占用的内存很多,就会被优先清理掉。如果我们希望 APP 可以存活的久一点,不使用的内存应该尽快清理掉;
至于哪些对象是需要回收的?使用跟搜索算法/可达性算法,选定一些对象作为 GC Roots,向下搜索,搜索所经过的路径称为引用链,当一个对象到 GC Roots 没有应用链相连,则表明此对象需要回收。以下是可以作为 GC Roots 的对象:

本地方法栈中引用的对象;
虚拟机栈中引用的对象;
全局静态变量引用的对象;
全局常量引用的对象;
Java虚拟机(四)—— Java虚拟机中的对象

1 内存泄漏
内存泄漏指的是我们的应用已经不需要某些对象了,但是,该对象的某些引用依旧没有释放,导致这些对象没有办法被回收。从内存上来看,就是某块内存已经不再被使用了,但是却没有办法被回收掉,从而造成了内存浪费。 比如说匿名内部类持有外部类的引用,导致外部类无法被回收,就会出现内存泄漏的问题。

内存泄漏会导致无法回收的内存越来越多,可用的内存越来越少,直到应用无更多可用的内存申请,严重的甚至出现 OOM。

内存泄漏

2 内存溢出(OOM Out Of Memory)
内存泄漏一般导致应用卡顿,极端情况会导致 OOM,OOM 的原因是因为超过内存的阈值。原因主要有两方面:

内存泄漏,导致无法及时释放导致 OOM;
一些逻辑消耗了大量内存,无法及时释放或者超过导致 OOM;


能够消耗大量内存的,绝大多数是因为图片加载。这是 OOM 出现最频繁的地方。图片加载,一个是控制每次加载的数量,二是保证每次滑动的时候不进行加载,滑动完进行加载。一般情况使用先进后出,而不是先进先出。 不过一般我们图片加载都是使用 fresco 或者 Glide 等开源库。

下面是导致内存溢出的两种情况:

通过命令行查看内存消耗情况(adb shell dumpsys meminfo 包名 -d):


对于图片的内存优化:

图片缩放,比如说一张图片的宽高为 200 x 200,但是 View 的宽高为 100 x 100,这个时候就要对图片进行缩放,通过 inSampleSize 实现;
减少每个像素所占用的内存,在 API 29 中,将 Bitmap 分为 ALPHA_8、RGB_565、ARGB_4444、RGBA_F16、HARDWARE 六个等级:
ALPHA_8:不存储颜色信息,每个像素占 1 个字节;
RGB_565:仅存储 RGB 通道,每个像素占 2 个字节,对 Bitmap 色彩没有高要求,可以使用该模式;
ARGB_4444:已弃用,用 ARGB_8888 代替;
ARGB_8888:每个像素占用 4 个字节,保持高质量的色彩保真度,默认使用该模式;
RGBA_F16:每个像素占用 8 个字节,适合宽色域和 HDR;
HARDWARE:一种特殊的配置,减少了内存占用同时也加快了 Bitmap 的绘制;
每个等级每个像素所占用的字节是不一样的,所存储的色彩值也不同,同一张 100 像素的图片,ARGB_8888 占用了 400 字节,RGB_565 才占用 200 字节。所以在某些场景中,修改图片格式也可以达到减少一半内存的效果。
内存复用,避免重复分配内存。Bitmap 所占用的内存比较大,如果频繁的创建和回收 Bitmap,很容易造成内存抖动,所以应该尽量复用 Bitmap 内存。在 Android 3.0(API 级别 11)开始,系统引入了 BitmapFactory.Options.inBitmap 字段。如果设置了此选项,那么采用 Options 对象的解码方法会在生成目标 Bitmap 时尝试复用 inBitmap,这意味着 inBitmap 的内存得到了重复使用,从而提高了性能,同时移除了内存分配和取消分配。不过 inBitmap 的使用方式存在某些限制,在 Android 4.4(API 级别 19)之前系统仅支持复用大小相同的位图,4.4 之后只要 inBitmap 的大小比目标 Bitmap 大即可
大图局部加载策略:对于图片加载还有种情况,就是单个图片非常巨大,并且还不允许压缩。比如显示:世界地图、清明上河图、微博长图等。首先不压缩,按照原图尺寸加载,那么屏幕肯定是不够大的,并且考虑到内存的情况,不可能一次性整图加载到内存中。所以这种情况的优化思路一般是局部加载,通过 BitmapRegionDecoder 来实现
上面所说的这些关于 Bitmap 的内存优化策略其实都比较简单,而且我们在开发中可能很少用到
因为我们常用的图片框架比如 Glide 已经将这些都封装在里面了,所以一般情况下我们加载图片时不需要做这些特殊操作。

3 内存抖动
在短时间内频繁的创建或者销毁的对象,容易触发 GC,会引起内存抖动,比如在一个 for 循环中创建临时对象实例。

因为 GC 的时候所有的线程都会停止工作,因此导致卡顿。为了避免内存抖动,应该避免以下操作:

尽量避免在循环体中创建对象,如果可以的话把创建的对象移到循环体外;
尽量不要在自定义 View.onDraw() 方法中创建对象,因为这个方法会被频繁调用;
对于能够复用的对象,可以考虑使用对象池把它们缓存起来。需要注意的是,使用结束后要手动释放对象池里的对象;

相关文章:

Android性能优化—— 内存优化

Android 系统中,垃圾回收是自动的,比较隐蔽,这就导致一些内存问题表现的并不明显,出现问题后难以定位。常见的内存问题有内存泄漏、内存溢出(Out of Memory)、内存抖动等。 我们做内存优化的主要原因有以下…...

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算 一、简介 在MATLAB中计算Sobol二阶效应指数通常涉及到全局敏感性分析(Global Sensitivity Analysis, GSA),其中Sobol方法是一种流行的技术,用于评估模型输入…...

【Scala】图书项目系统代码演练3.1/BookService

package org.app package serviceimport models.{BookModel, BorrowRecordModel}import org.app.dao.{BookDAO, BorrowRecordDAO}import java.time.LocalDateTime import scala.collection.mutable.ListBuffer// 图书业务逻辑层 class BookService {private val bookDAO new B…...

Gateway

目录 使用 工作机制 Predicate断言 Filter过滤器(鉴权) GatewayFilter GlobalFilter 使用 Gateway底层是使用Ribbon来实现负载均衡的 新建模块,端口5001 1、引入依赖 spring-boot-starter-web里存在tomcat,spring-cloud-st…...

SpringSecurity中的过滤器链与自定义过滤器

关于 Spring Security 框架中的过滤器的使用方法,系列文章: 《SpringSecurity中的过滤器链与自定义过滤器》 《SpringSecurity使用过滤器实现图形验证码》 1、Spring Security 中的过滤器链 Spring Security 中的过滤器链(Filter Chain)是一个核心的概念,它定义了一系列过…...

【OTA】论文学习笔记--《基于RTOS的车载ECU双分区OTA升级技术分析报告》

引言 研究背景 - 汽车智能化、网联化发展趋势下,OTA升级已成为智能网联汽车的必备功能 - 传统RTOS控制器在OTA升级失败后无法进行软件回滚,导致控制器功能失效 - 现有技术主要针对Linux、QNX等智能操作系统,缺乏针对RTOS的解决方案 研究目的 提出一种适用于RTOS控制器的双分…...

MLA:多头潜在注意力

MLA:多头潜在注意力 多头潜在注意力(MLA)机制是一种在深度学习模型中用于处理序列数据的注意力机制的改进形式,以下是对其原理和示例的详细介绍: 原理 低秩键值联合压缩:MLA机制利用低秩键值联合压缩来消除注意力模块中的某些计算,从而提高模型的运行速度和性能。在传…...

【python】matplotlib(moon cake)

文章目录 1、Style12、Style23、Style34、Style45、Style56、Style67、Style78、参考的库函数matplotlib.patches.Arcmatplotlib.patches.Wedge 9、参考 1、Style1 """ author: tyran """from numpy import sin, cos, pi import matplotlib.pyp…...

C++ hashtable

文章目录 1. 基本概念2. 哈希函数3. 哈希冲突及解决方法开放定址法链地址法再哈希法建立公共溢出区4. 哈希表的操作实现5. 内存管理及优化 时间复杂度理想情况(无哈希冲突或冲突极少)一般情况(考虑哈希冲突及解决方法)综合来看 以…...

ip怎么查域名?IP和域名分别是什么?

为什么我们可以通过简单的域名访问网站,而不是记住一串复杂的数字?IP地址和域名之间到底是什么关系?在互联网的世界里,IP地址和域名是两种重要的概念,它们共同构成了我们日常上网的基础。 IP地址是互联网协议地址的缩…...

大模型提示词初探

大模型提示词初探 在与大模型交互的过程中,提示词起着至关重要的作用,它犹如给模型下达的精准任务指令,直接影响着模型生成内容的准确性、高效性与合理性。合理运用提示词,能够有效减少模型出现错误和幻觉的情况,从而…...

Linux的进程替换以及基础IO

进程替换 上一篇草率的讲完了进程地址空间的组成结构和之间的关系,那么我们接下来了解一下程序的替换。 首先,在进程部分我们提过了,其实文件可以在运行时变成进程,而我们使用的Linux软件其实也是一个进程,所以进一步…...

《Vue进阶教程》第三十一课:ref的初步实现

往期内容: 《Vue进阶教程》第二十课:lazy懒执行 《Vue进阶教程》第二十一课:支持缓存 《Vue进阶教程》第二十二课:自定义更新(调度器) 《Vue进阶教程》第二十三课:渲染计算属性的结果 《Vue进阶教程》第二十四课&…...

Wend看源码-Java-集合学习(Queue)

概述 Wend看源码-Java-集合学习(List)-CSDN博客 Wend看源码-Java-集合学习(Set)-CSDN博客 在前两篇文章中,我们分别探讨了Java集合框架的父类以及List集合和Set集合的实现。接下来,本文将重点阐述Java中的Queue集合,包括其内部的数据结…...

大数据面试笔试宝典之HBase面试

1.HBase 数据存储位置 HBase 中的数据存储在哪里? 以什么格式存储?和 Zookeeper 什么关系? 参考答案: 1.HBase 中的所有数据文件都存储在 Hadoop HDFS 文件系统上。 2.包含两种文件类型: HFile : HBase 中 KeyValue 数据的存储格式。HFile 是 Hadoop 的二进制格式文件…...

React基础知识学习

学习React前端框架是一个系统而深入的过程,以下是一份详细的学习指南: 一、React基础知识 React简介 React是一个用于构建用户界面的JavaScript库,由Facebook开发和维护。它强调组件化和声明式编程,使得构建复杂的用户界面变得更…...

实战指南:Shiro、CAS打造完美单点登录体验

引言 想象一下,在日常工作中,我们经常需要进行系统认证和授权。当用户尝试登录一个网站时,他们需要提供用户名和密码,网站会检查这些信息,确认用户是谁。这就是认证的过程。 一旦用户被认证,他们可能会尝…...

光储充一体化解决方案详解。

一、光储充介绍 1、什么是光储充 “光储充”一体化,顾名思义,是由光伏发电、储能、充电集成一体、互相协调支撑的绿色充电模式。其工作原理是利用光伏发电,余电由储能设备存储,共同承担供电充电任务。在用电高峰,光储…...

TDengine 新功能 VARBINARY 数据类型

1. 背景 VARBINARY 数据类型用于存储二进制数据,与 MySQL 中的 VARBINARY 数据类型功能相同,VARBINARY 数据类型长度可变,在创建表时指定最大字节长度,使用进按需分配存储,但不能超过建表时指定的最大值。 2. 功能说明…...

2024年秋词法分析作业(满分25分)

【问题描述】 请根据给定的文法设计并实现词法分析程序,从源程序中识别出单词,记录其单词类别和单词值,输入输出及处理要求如下: (1)数据结构和与语法分析程序的接口请自行定义;类别码需按下表格…...

AF3 checkpoint_blocks函数解读

checkpoint_blocks 函数实现了一种分块梯度检查点机制 (checkpoint_blocks),目的是通过分块(chunking)执行神经网络模块,减少内存使用。在深度学习训练中,梯度检查点(activation checkpointing)是一种显存优化技术。该代码可以: 对神经网络的块(blocks)按需分块,并对…...

VITUREMEIG | AR眼镜 算力增程

根据IDC发布的《2024年第三季度美国AR/VR市场报告》显示,美国市场AR/VR总出货量增长10.3%。其中,成立于2021年的VITURE增长速度令人惊艳,同比暴涨452.6%,成为历史上增长最快的AR/VR品牌。并在美国AR领域占据了超过50%的市场份额&a…...

详解MySQL在Windows上的安装

目录 查看电脑上是否安装了MySQL 下载安装MySQL 打开MySQL官网,找到DOWNLOADS 然后往下翻,找到MySQL Community(GPL) Downloads>> 然后找到MySQL Community Server 然后下载,选择No thanks,just start my download. 然后双击进行…...

细说STM32F407单片机CAN基础知识及其HAL驱动程序

目录 一、CAN总线结构和传输协议 1、 CAN总线结构 (1)闭环结构的CAN总线网络 (2)开环结构的CAN总线网络 (3)隐性电平和显性电平 2、CAN总线传输协议 (1)CAN总线传输特点 &am…...

Ubuntu 22.04 升级 24.04 问题记录

一台闲置笔记本使用的 ubuntu 还是 18.04,最近重新使用,发现版本过低,决定升级,于是完成了 18.04 -> 20.04 -> 22. 04 -> 24.04 的三连跳。 一、升级过程中黑屏 主要问题是在 22.04 升级到 24.04 过程中出现了黑屏仅剩…...

模型选择+过拟合欠拟合

训练误差和泛化误差 训练误差:模型在训练数据上的误差 泛化误差:模型在新数据上的误差 验证数据集:一个用来评估模型好坏的数据集 例如拿出50%的数据作为训练 测试数据集:只能用一次 K则交叉验证 在没有足够数据时使用 算法…...

Leetcode 3404. Count Special Subsequences

Leetcode 3404. Count Special Subsequences 1. 解题思路2. 代码实现 题目链接:3404. Count Special Subsequences 1. 解题思路 这道题是事实上这次的周赛最难的一道题目,不过也是有点巧思在内。 最开始我的想法就是按照乘积构成pair,然后…...

萌萌哒的八戒

萌萌哒的八戒 下载压缩包后,打开发现有一张照片 既然是关于猪的,那就用猪圈密码解码 flag{whenthepigwanttoeat}...

开启家具组装新方式:产品说明书智能指导

在快节奏的现代生活中,人们越来越追求便捷与高效。无论是新房装修还是家具换新,家具组装已成为许多家庭不可避免的一项任务。然而,面对复杂多变的家具图纸和冗长的产品说明书,许多人常常感到无从下手,甚至因操作不当而…...

【连续学习之ResCL算法】2020年AAAI会议论文:Residual continual learning

1 介绍 年份:2020 会议: AAAI Lee J, Joo D, Hong H G, et al. Residual continual learning[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2020, 34(04): 4553-4560. 本文提出的算法是Residual Continual Learning (ResC…...

【网络协议】路由信息协议 (RIP)

未经许可,不得转载。 路由信息协议(Routing Information Protocol,简称 RIP)是一种使用跳数(hop count)作为路由度量标准的路由协议,用于确定源网络和目标网络之间的最佳路径。 文章目录 什么是…...

Linux 终端查看 nvidia 显卡型号

文章目录 写在前面1. 需求描述2. 实现方法方法一:方法二方法三: 参考链接 写在前面 自己的测试环境: Ubuntu20.04 1. 需求描述 Linux 终端查看 nvidia 显卡型号 2. 实现方法 方法一: 执行下列指令: sudo update…...

基于neurokit2的心电仿真数据生成实例解析

一 概念 NeuroKit2是一个开源的、社区驱动的、以用户为中心的Python库,可用于多种生理信号的分析处理(例如ECG、PPG、EDA、EMG、RSP),还包括用于特定处理步骤(如频率)的工具提取和过滤方法,并在…...

AMBA-APB

目录 1.APB 协议 2.APB信号列表 3.数据传输 3.1写传输(2种) 3.1.1 无等待状态的写传输 3.1.2有等待状态的写传输 3.2写选通信号 (PSTRB) 字节通道映射 3.3读传输(2种) 3.3.1 无等待状态的读传输 3.3.2有等待状态的读传…...

网安入门之PHP后端基础

PHP 基本概念详解 PHP是一种服务器端脚本语言,常用于动态网站开发和 web 应用程序。以下是 PHP 的基本概念与特点的详细说明: 1. PHP 文件的默认文件扩展名 PHP 文件的扩展名通常为 .php,例如 index.php。PHP 文件可以包含 PHP 代码、HTML…...

windows系统安装完Anaconda之后怎么激活自己的虚拟环境并打开jupyter

1.在win主菜单中找到Anaconda安装文件夹并打开终端 文件夹内有所有安装后的Anaconda的应用软件和终端窗口启动窗口 点击Anaconda Prompt(Anaconda)就会打开类似cmd的命令终端窗口,默认打开的路径是用户名下的路径 2.激活虚拟环境 使用命令…...

【C#特性整理】C#特性及语法基础

1. C#特性 1.1 统一的类型系统 C#中, 所有类型都共享一个公共的基类型. 例如,任何类型的实例都可以通过调用ToString方法将自身转换为一个字符串 1.2 类和接口 接口: 用于将标准与实现隔离, 仅仅定义行为,不做实现. 1.3 属性、方法、事件 属性: 封装了一部分对…...

龙蜥 配置本地yum源8.6----亲测

系统版本: 说明:丫丫的,内网服务安装了个龙蜥操作系统。内网不能访问互联网,所以就需要挂载yum源 用的以前的方法挂载,一直报错 [Couldnt open file /mnt/anolisos/repodata/repomd.xml] yum挂载的时候报错,奇葩!!!,龙蜥的挂载方法好像不一样。 解决: 一、上传并挂…...

Xshell日志录制

步骤 1:设置日志文件位置 打开 Xshell 软件,选择目标会话(或者创建一个新的会话)。右键点击会话名称,选择“属性”。在会话属性窗口中,找到“日志”选项卡。勾选“启用日志记录”。在“文件名”中设置日志…...

vue下载和上传的地址动态ip地址配置方法

vue3结合element-plus实现【下载文件】和【上传文件】的动态ip地址配置 效果图 一、修改【文件上传】静态地址 1、首先引入axios import axios from "/utils/request"; import { getToken } from "/utils/auth"; 定义 const importDialogVisible ref(…...

动手做计算机网络仿真实验入门学习

打开软件 work1 添加串行接口模块,先关电源,添加之后再开电源 自动选择连接 所有传输介质 自动连接 串行线 绿色是通的,红色是不通的。 显示接口。se是serial串行的简写。 Fa是fast ethernet的简写。 为计算机配置ip地址: 为服…...

LeetCode 面试题 17.10. 主要元素

LeetCode 面试题 17.10. 主要元素 数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。 示例 1: 输入:[1,2,5,9,5,9,5…...

Hive之import和export使用详解

在hive-0.8.0后引入了import/export命令。 Export命令可以导出一张表或分区的数据和元数据信息到一个输出位置,并且导出数据可以被移动到另一个hadoop集群或hive实例,并且可以通过import命令导入数据。 当导出一个分区表,原始数据可能在hdf…...

SpringBoot数据字典字段自动生成对应code和desc

效果:接口会返回orderType,但是这个orderType是枚举的类型(1,2,3,4),我想多返回一个orderTypeDesc给前端展示,这样前端就可以直接拿orderTypeDesc使用了。 1. 定义注解 …...

HTML——16.相对路径

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><a href"../../fj1/fj2/c.html" target"_blank">链接到c</a><!--相对路径&#xff1a;-->…...

字——位级运算与有无符号数之间的比较

前言 本文整理和归纳《深入理解计算机系统》这本书的内容&#xff0c;但本文不会继续长篇大论地去将所有内容都总结&#xff0c;而是总结笔者认为容易遗忘或混淆或表述不清的内容。 字 首先字这个概念对于学习过《计算机体系结构》或《操作系统》的同学都不陌生&#xff0c;…...

Python爬虫教程——7个爬虫小案例(附源码)_爬虫实例

本文介绍了7个Python爬虫小案例&#xff0c;包括爬取豆瓣电影Top250、猫眼电影Top100、全国高校名单、中国天气网、当当网图书、糗事百科段子和新浪微博信息&#xff0c;帮助读者理解并实践Python爬虫基础知识。 包含编程资料、学习路线图、源代码、软件安装包等&#xff01;【…...

‘Optional. get()‘ without ‘isPresent()‘ check

在Java中&#xff0c;Optional类被引入主要是为了解决NullPointerException的问题&#xff0c;它提供了一种更优雅的方式来处理可能为null的情况。Optional.get()方法用于获取Optional实例中包含的值&#xff0c;但如果Optional实例是空的&#xff08;即没有值&#xff09;&…...

015-spring-动态原理、AOP的xml和注解方式

强制使用cglib动态代理 spring-AOP的使用...

统计颜色Count Color(POJ2777)题解

有一个长度为L厘米板&#xff0c;L是一个正整数&#xff0c;所以我们可以把它均匀地划分成L个部分&#xff0c;分别从左到右编号为1&#xff0c;2……L&#xff0c;每一个部分长度都为1厘米。现在我们必须给每个部分涂色&#xff0c;一个部分一种颜色&#xff0c;要求完成以下两…...