一文了解安卓内存抖动

news2024/11/16 7:31:43

目录

  • 目录
  • 一、什么是内存抖动?
    • 1.1 Android里的内存抖动
    • 1.2 如何直观查看这种现象
    • 1.3 内存抖动带来的风险
  • 二、如何避免内存抖动


目录

一、什么是内存抖动?

在程序里,每创建一个对象,就会有一块内存分配给它,每分配一块内存,程序的可用内存也就少了一块,当程序占用的内存达到一定临界程度,GC也就是垃圾回收器(Garbage Collection)就会出动,来回收这一部分不再使用的内存。

1.1 Android里的内存抖动

Android 里的view.ondraw()方法在每次需要重绘的时候都会被调用,这就意味着如果在ondraw()里写了创建对象的代码,那么在界面频繁刷新的时候,也就会频繁的创建出一大批只被使用一次的对象,这就会导致内存的迅速攀升,然后很快可能就会触发GC的回收动作,也就是被创造的对象被GC回收掉,垃圾内存太多了就被清理掉,这是java的工作机制,这不是问题。

问题在于频繁创建这些对象会导致内存不断地攀升,在刚回收了之后又迅速涨起来,紧接着就是又一次的回收,往复下来,就会导致一种循环,一种在短时间内反复的发生内存增长和回收的循环,这种循环往复的状态就像是水波纹的颤动一样,专业称呼叫作Memory Churn,android 的官方文档就把他翻译成了 内存抖动

1.2 如何直观查看这种现象

可以通过Android Studio的 Memory Profiler来直观的观察这种现象。

在这里插入图片描述
在这里插入图片描述

可以看到 下面的一溜白色垃圾桶。说明在大量的执行gc操作

1.3 内存抖动带来的风险

内存的回收虽然很快,时间成本很低,但终究是有时间成本的,一两次的回收不容易被用户察觉,但是多次回收行为在短时间内集中爆发,就会导致概率很大的界面卡顿的风险,

所以要避免在ondraw()里创建对象。同理不只是ondraw(),在次数较大的循环里创建对象同样会导致内存抖动。
ondraw()里创建的对象通常是和绘制相关的对象,这些对象通常包含下层native对象的引用,这就会导致ondraw()里创建对象所导致的内存回收的耗时会更高,界面更卡顿。

内存抖动可能会导致内存溢出,而内存溢出的直接结果就是软件崩溃。


二、如何避免内存抖动

  • 注意自定义View的onDraw()方法会被频繁调用,所以在这里面不应该频繁的创建对象。
  • 当需要大量使用Bitmap的时候,试着把它们缓存在数组中实现复用。
  • 减少对象的创建和销毁:尽量避免在循环或频繁调用的地方创建和销毁对象,可以通过对象池、复用对象等方式减少对象的创建和销毁次数。
  • 使用合适的数据结构:选择合适的数据结构可以减少内存抖动,例如使用ArrayList替代LinkedList,避免频繁的内存分配和释放。
  • 避免在循环中进行大量的字符串拼接操作:字符串拼接操作会创建大量的临时对象,容易引起内存抖动,可以使用StringBuilder或StringBuffer来优化。
  • 使用线程池:合理使用线程池可以减少线程的创建和销毁,避免频繁的内存分配和释放。

Tips:
内存抖动和内存泄漏是两个不同的问题。内存抖动是指内存分配和释放频繁发生,导致内存使用不稳定,影响应用性能。而内存泄漏是指应用程序中的内存无法被正确释放,导致内存占用不断增加,最终导致应用程序崩溃或性能下降。
内存抖动可能会导致内存泄漏,因为频繁的内存分配和释放会增加内存管理的负担,可能会导致内存管理出现问题,从而引发内存泄漏。因此,避免内存抖动也可以间接地减少内存泄漏的风险。

参考链接:
Android 性能优化 - 彻底解决内存抖动
Android内存抖动(主要原因分析+6个优化小技巧)

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

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

相关文章

使用 RisingWave 和 Redash 处理和可视化实时数据

在创建流处理管道时,需要两个关键组件:一个用于处理和转换数据,一个用于数据可视化。RisingWave 和 Redash 就提供了一个优秀的解决方案。 RisingWave 是一个支持实时数据处理的分布式 SQL 流数据库。它提供增量更新的物化视图,使…

【MySQL精通之路】MySQL8.0新增功能-原子DDL语句支持

太长不看系列: 本文一句话总结,MySQL8.0支持多条DDL语句执行时的原子性了(仅限Innodb) 本文属于下面这篇博客的子博客: 【MySQL精通之路】MySQL8.0官方文档-新增功能 1.意义描述 MySQL 8.0支持原子数据定义语言&…

实用的TypeScript开发工具

1、根据接口数据自动定义类型变量:https://wulunyi.github.io/typeof-sjsonc-web/build/index.html ……(持续更新中)

Vue 离线地图实现

效果图: 一、获取市的地图数据 DataV.geoAtlas 获取市地图数据 点击地图缩放至想要的市区域,通过右侧的链接打开网址,复制json数据。 二、获取镇地图数据 选择你想要的镇数据,点击下载 选择级别(清晰度&#xff09…

关闭以及启动ubuntu图形界面

关闭以及启动ubuntu图形界面 文章目录 关闭以及启动ubuntu图形界面1. 关闭图形界面2. 打开图形界面 如果你误杀了Xorg进程,需要重新启动图形界面,可以按照以下步骤操作: 1. 关闭图形界面 查看当前启动的图形界面: 使用下面命令…

【linux系统学习教程 Day03】网络安全之Linux系统学习教程,用户和用户组管理,创建用户,删除用户,创建组,删除组....

1.7 用户和用户组管理 1.7.1 用户管理 1-1 创建用户 #创建用户 useradd #创建一个用户 例子1:useradd test1 #创建用户 useradd #创建一个用户 例子1:useradd dilnur 1-2 设置密码 passwd 例子1:passwd dilnur #用root用户给…

9.1 Go语言入门(环境篇)

Go语言入门(环境篇) 目录一、什么是Go语言二、下载安装配置Go语言开发环境1. 下载2. 安装3. 配置环境变量4. 安装环境验证 三、 开发工具1. 下载2. 安装3. 激活4. 配置SDK 四、 创建go工程文件并运行1. 创建go工程2. 示例代码3. 运行代码 目录 一、什么…

操作系统 c语言简单模仿进程创建和时间片轮转调度算法中的进程调度

1.实验目的 加深对进程概念的理解,明确进程和程序的区别; 深入了解系统如何组织进程、创建进程; 进一步认识如何实现处理器调度。 2.实验预备知识 进程的概念; 进程的组织方式; 进程的创建…

CCF20220601——归一化处理

CCF20220601——归一化处理 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,a[1000],sum0;scanf("%d",&n);for(int i1;i<n;i){scanf("%d",&a[i]);suma[i];}double aver1.0,b0.0,d1.0;aversum/(n*1…

深度学习之基于Django+Tensorflow卷积神经网络实时口罩检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着全球疫情的持续&#xff0c;佩戴口罩成为了公众日常生活中不可或缺的一部分。特别是在人员密集的…

佛山远程抄表电表是什么?

1.佛山远程抄表电表&#xff1a;简述 佛山远程抄表电表&#xff0c;是一种利用通信网技术完成智能电表系统软件&#xff0c;它改变了传统的人工抄水表方式&#xff0c;提升了电力管理的效率和精确性。这类电表不但可以实时检测电力应用情况&#xff0c;还可以实现远程操作、全…

第二证券今日投资参考:5月国产游戏版号发放 猪价加速上涨

昨日&#xff0c;两市股指盘中震荡上扬&#xff0c;沪指盘中续创年内新高&#xff0c;创业板指一度涨超1%。到收盘&#xff0c;沪指涨0.54%报3171.15点&#xff0c;深证成指涨0.43%报9750.82点&#xff0c;创业板指涨0.59%报1875.93点&#xff0c;上证50指数涨0.34%&#xff1b…

Vue学习穿梭框Transfer组件

Vue学习Transfer组件 一、前言1、案例一2、案例二 一、前言 在 Vue 3 中使用 el-transfer 组件可以帮助你实现数据的穿梭功能&#xff0c;让用户可以将数据从一个列表转移到另一个列表。下面是一个简单示例&#xff0c;演示如何在 Vue 3 中使用 el-transfer 组件&#xff1a; …

C语言 数组——向函数传递数组

目录 把数组传给函数&#xff08;Passing Arrays to Functions&#xff09; 向函数传递一维数组 向函数传递二维数组 数组在学生成绩管理中的应用 例&#xff1a;计算每个学生的平均分 把数组传给函数&#xff08;Passing Arrays to Functions&#xff09; 向函数传递一维…

Harbor 使用中出现的问题

安装 使用宝塔安装 安装成功的标志&#xff0c;见下图。初始的默认用户是admin&#xff0c;密码是Harbor12345&#xff0c;登录成功&#xff1a; 错误现象 # docker login 192.168.1.50:8005 Username: admin Password: Error response from daemon: Get "https://1…

民国漫画杂志《时代漫画》第18期.PDF

时代漫画18.PDF: https://url03.ctfile.com/f/1779803-1248612707-27e56b?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

./scripts/Makefile.clean 文件分析

文章目录 目标 $(subdir-ymn)目标__clean $(clean-dirs):     make -f ./scripts/Makefile.clean obj$(patsubst _clean_%,%,$) $(clean-dirs)$(patsubst _clean_%,%,$)_clean_api _clean_cmd _clean_common _clean_disk _clean_drivers _clean_drivers/ddr/altera _clean_d…

【spring】@CrossOrigin注解学习

CrossOrigin介绍 CrossOrigin 是 Spring Framework 中的一个注解&#xff0c;用于处理跨域资源共享&#xff08;CORS&#xff09;问题。CORS 是一种机制&#xff0c;它使用额外的 HTTP 头来告诉浏览器&#xff0c;让运行在一个 origin (domain) 上的Web应用被准许访问来自不同…

linux 安装redis 并设置开机启动

个人实测 流程 1、第一步 先下载redis ** redis地址 https://download.redis.io/releases/选择你想要的版本 我下载的是 如下图 2、第二步:把下载的包放到linux里面 我用的是 XSHELL 和XFTP 放到/usr/local/java路径下 你可以随便放 3、第三步: ** 执行 以下命令 进行解压 t…

10最佳iPhone数据恢复软件评论

您还在寻找最好的iPhone数据恢复软件吗&#xff1f; 似乎我们在iPhone上放置了越来越多与日常生活和工作有关的重要事情。照片可以保持珍贵的时刻&#xff0c;联系人可以保持联系&#xff0c;录音&#xff0c;备忘录和日历可以作为提醒&#xff0c;视频和歌曲可以娱乐&#xf…