一文了解安卓内存抖动

目录

  • 目录
  • 一、什么是内存抖动?
    • 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.rhkb.cn/news/333149.html

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

相关文章

超详细的前后端实战项目(Spring系列加上vue3)前后端篇(四)(一步步实现+源码)

兄弟们,继昨天的代码之后,继续完成最后的用户模块开发, 昨天已经完成了关于用户的信息编辑页面这些,今天再完善一下, 从后端这边开始吧,做一个拦截器,对用户做身份校验, 拦截器 这…

燃数科技前端25-40K*14薪一面超简单,下周二面啦

​​​​​​​ 文章末尾扫描二维码领取地址 一面 1、自我介绍 2、低代码如何设计的 3、react路由原理 4、react生命周期 5、什么是回调地狱,如何解决 6、jwt和session有什么区别 7、js文件相互引用有什么问题?如何解决 8、一个很大的json文件…

安卓手机APP开发__平台的架构

安卓手机APP开发__平台的架构 目录 概述 安卓软件栈 Linux内核 硬件抽象层(HAL) 安卓运行时 原生的C/C代码库 Java API框架 系统APP 概述 安卓是一个开源的,基于Linux的软件栈,它创建一个设备和形式因素的很宽的矩阵。 下图展示了安卓平台的所有…

全方位质量保障!龙蜥在内核、软件包、容器镜像、三方模块的 CI 工程实践

编者按:在海量的代码测试和构建中, CI(Continuous Integration)在代码提交阶段,对提高软件质量和开发效率起到了至关重要的作用。2023 龙蜥操作系统大会全面繁荣开发者生态分论坛上,龙蜥社区 QA SIG Maintainer、联通数科 CUlinux…

YOLOv8 Closing dataloader mosaic

在使用YOLOV8训练时,epoch训练到最后10次出现”Closing dataloader mosaic",又不是报错,但又不往下进行训练,有点懵了,后面经过了解,Yolov8是默认设置close_mosaic10,需要把它修改为0; clo…

什么是HTTP代理?适用于哪些场景?

HTTP代理是一种网络代理服务器,它主要用于处理HTTP协议的请求和响应。HTTP代理充当客户端(如浏览器)和目标服务器之间的中介,允许客户端通过代理服务器来发送HTTP请求,并接收来自服务器的响应。HTTP代理可以分为正向代…

C++ 虚函数和纯虚函数

虚函数 #include <iostream> using namespace std; class Vehicle //交通工具 { public:void run() const{cout << "run a vehicle. " << endl;} }; class Car : public Vehicle //汽车 { public:void run() const{cout << "run a c…

报名倒计时!「飞天技术沙龙-CentOS 迁移替换专场」参会指南

为帮助广大用户诊断 CentOS 迁移替换过程中的疑难杂症&#xff0c;「飞天技术沙龙-CentOS 迁移替换专场」将于 5 月 29 日&#xff08;周三&#xff09;在北京举办&#xff0c;将围绕如何在确保服务的连续性和稳定性的前提下实现平滑迁移及如何最大限度地利用现有资源前提下确保…

R可视化:另类的箱线图

介绍 方格状态的箱线图 加载R包 knitr::opts_chunk$set(echo TRUE, message FALSE, warning FALSE) library(patternplot) library(png) library(ggplot2) library(gridExtra)rm(list ls()) options(stringsAsFactors F)导入数据 data <- read.csv(system.file(&qu…

营销短信XML接口对接发送示例

在现代社会中&#xff0c;通信技术日新月异&#xff0c;其中&#xff0c;短信作为一种快速、简便的通信方式&#xff0c;仍然在日常生活中占据着重要的地位。为了满足各种应用场景的需求&#xff0c;短信接口应运而生&#xff0c;成为了实现高能有效通信的关键。 短信接口是一种…

使用RAG和文本转语音功能,我构建了一个 QA 问答机器人

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

Spring 事务源码分析

前言&#xff1a; 我们知道 Spring 声明式事务是通过 AOP 来实现的&#xff0c;日常项目开发中我们只需要使用 Transactional 注解就可以实现声明式事务&#xff0c;那你知道通过 Transactional 注解怎样实现事务的吗&#xff1f;本篇我们将从源码来分析 Spring 声明式事务的执…

【测评】OrangePi AIPro环境配置与基础应用

1.介绍 官网&#xff1a;http://www.orangepi.cn/ 社区&#xff1a;http://forum.orangepi.cn/ 昇腾社区&#xff1a;https://www.hiascend.com/ OrangePi AIPro 是一款基于昇腾AI技术的开发板&#xff0c;它采用华为昇腾910E AI芯片&#xff0c;集成4核64位CPU和AI处理器&am…

【Unity之FGUI】黑神章Fairy GUI控件详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

宝塔下新增站点 No Input File Specified.错误修复

今天明月收到了一个购买【站长必备在线工具源码含上百款工具-博客优化修复版】用户的求助&#xff0c;在宝塔里新增网站部署好工具源码后&#xff0c;访问出现“No input file specified.”的提示。其实出现这个提示一般都是 PHP 文件无法被解析造成的。 简单排查了一下宝塔相关…

python技巧梳理

背景 在开发中&#xff0c;经常会遇到&#xff0c;同时存在多个值&#xff0c;依次判断上述值&#xff0c;选择第一个非空、True的值作为整个表达式的值进行返回&#xff0c;这个时候会用到or这个关键词&#xff0c;下面讲一下用法。 方法 value1 None value2 0 value3 H…

教师专属的成绩发布小程序

还在为成绩发布而烦恼&#xff1f;还在担心家长无法及时获得孩子的学习反馈&#xff1f;是否想要一个既安全又高效的工具来简化你的教学工作&#xff1f;那么&#xff0c;易查分小程序可能是你一直在寻找的答案。 现在的老师们有了超多的工具来帮助我们减轻负担&#xff0c;提高…

快速搭建 WordPress 外贸电商网站指南

本指南全面解析了在 Hostinger 平台上部署 WordPress 外贸电商网站的详细步骤&#xff0c;涵盖托管方案选择、WordPress 一键安装、主题挑选与演示数据导入、主题个性化定制、SEO插件插件 AIOSEO 安装、通过 GTranslate 实现多语言自动翻译、地区访问控制插件&#xff0c;助力用…

【C++练级之路】【Lv.21】C++11——列表初始化和声明

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、列表初始化1.1 内置类型1.2 结构体或类1.3 容器 二、声明2.1 auto2.2 decltype2.3 nullptr 三、STL的…