一文了解安卓内存抖动

目录

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

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

相关文章

LabVIEW虚拟测试实验室开发

LabVIEW虚拟测试实验室开发 在当代的科技和工业进步中,测试与测量扮演着至关重要的角色。随着技术的发展,测试系统也变得日益复杂和成本昂贵,同时对测试结果的准确性和测试过程的效率要求越来越高。开发了一种基于LabVIEW的虚拟测试实验室的…

ICQ 将于 6 月关闭,这是一种奇怪的方式,发现它在 2024 年仍然活跃

你知道ICQ还活着吗?不过,不要太兴奋;它将永远消失。 还记得ICQ吗?如果你这样做了,你可能会记得它是AOL在1998年购买的Messenger客户端,就在Yahoo Instant Messager和MSN Messenger加入竞争的时候。然后Skype出现了&…

SpringBoot3笔记(一)SpringBoot3-核心特性

快速学习 SpringBoot 看官方文档: Spring Boot Reference Documentation 计划三天学完 笔记:https://www.yuque.com/leifengyang/springboot3 代码:https://gitee.com/leifengyang/spring-boot-3 一、SpringBoot3 - 快速入门 1.1 简介 …

【全开源】招聘求职小程序系统源码(ThinkPHP+原生微信小程序)

基于ThinkPHP和原生微信小程序开发的招聘平台系统,包含微信小程序求职者端、微信小程序企业招聘端、PC企业招聘端、PC管理平台端 构建高效人才交流平台 一、引言:招聘求职市场的数字化趋势 在数字化时代,招聘求职市场也迎来了巨大的变革。…

仅需一块 4GB 的 GPU ,就能运行开源大语言模型:Llama3 70B

最强的开源大语言模型 Llama3 已经发布一段时间了,一些盆友资源有限,私信询问是否可以使用 4GB 的 VRAM 在本地运行 Llama3 70B。 与 GPT-4 相比,Llama3 的性能如何?Llama3 使用了哪些关键的前沿技术使其变得如此强大&#xff1f…

GDB对Linux信号的处理方式

前言 在软件开发过程中,调试工具是程序员不可或缺的助手。GDB(GNU Debugger)作为一个强大的调试器,广泛应用于Linux系统中的C/C程序调试。然而,信号处理机制的复杂性常常给调试带来挑战。特别是在处理异步和同步信号时…

深入理解指针(5)

在之前的深入理解指针(4)中我们学习了回调函数相关知识,并且学会了如何使用库函数qsort,以及模拟实现了qsort,接下来在本篇中将对srtlen和sizeof进行细致的讲解,并对相关的题型进行讲解,一起加油吧!&#x…

开放式耳机哪个品牌音质好用又实惠耐用?五大公认卷王神器直入!

​在现今耳机市场,开放式耳机凭借其舒适的佩戴体验和独特的不入耳设计,备受消费者追捧。它们不仅让你在享受音乐时,仍能察觉周围的声音,确保与人交流无障碍,而且有利于耳朵的卫生与健康。对于运动爱好者和耳机发烧友而…

ASP+ACCESS酒店房间预约系统设计

摘要 随着国内经济形势持续发展,国内酒店业进入难得的发展高峰期,使得中外资本家纷纷将目光投向中低端市场。然而,中国酒店业的区域结构不合理、竞争手段不足和市场对经济型酒店的需求日益显露,以及2008年北京奥运会、2010年上海…

数据分析工程师——什么是数据分析?

数据分析工程师 对于目前就业市场上的技术岗位,除了开发、测试、运维等常见职位之外,数据类岗位也越来越成为热门的求职方向。本文将重点介绍 数据分析 这一新兴岗位。 看到「数据分析」这几个字,也许大家的第一印象一样,觉得要做的工作似乎并不难,有大量数据后根据业务…

状态转换图

根据本章开头讲的结构化分析的第3条准则,在需求分析过程中应该建立起软件系统的行为模型。状态转换图(简称为状态图)通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为。此外,状态图还指明了作为特定事件的结果系统将做哪些动作(例如,处理数据)。因此,状态图提供了…

JS闭包、原型链简单理解

目录 1.闭包概念 1.1简单demo1: 1.2简单demo2 1.3使用let代替var解决这个问题 2.函数对象和原型链 ​编辑 2.1函数对象demo 2.2.原型链demo 3.使用闭包完成JQuery的一个小demo 1.闭包概念 1.当函数声明时,函数会通过内部属性[scope]来创建范围 2.闭包一个…

Android窗口管理

一 概述 本篇文章主要讲 Window、WindowManager、WindowManagerService 三者之间的关系及其运行机制。总的来说 Window 表示的是一种抽象的功能集合,具体实现为 PhoneWindow。WindowManager 是外界访问 Window 的入口,对 Window 的访问必须通过 Window…

微信小程序预览图片和H5使用canvas实现图片+蒙层+文字

1、效果 2.H5实现 <!--* Author: limingfang* Date: 2024-05-20 10:26:51* LastEditors: limingfang* LastEditTime: 2024-05-21 16:31:11* Description: --> <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8&q…

C++ | Leetcode C++题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; class Solution { public:bool hasPathSum(TreeNode *root, int sum) {if (root nullptr) {return false;}if (root->left nullptr && root->right nullptr) {return sum root->val;}return hasPathSum(root->left…

Java的类和对象

Java的类和对象 前言一、面向过程和面向对象初步认识C语言Java 二、类和类的实例化基本语法示例注意事项 类的实例化 三、类的成员字段/属性/成员变量注意事项默认值规则字段就地初始化 方法static 关键字修饰属性代码内存解析 修饰方法注意事项静态方法和实例无关, 而是和类相…

AI早班车5.25

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

C# 拓展方法(涉及Linq)

拓展方法 定义一个扩展方法使用扩展方法例如再举个例子终极例子 注意事项与Linq 在C#中&#xff0c;扩展方法是一种特殊的静态方法&#xff0c;允许开发者向现有类型“添加”新的方法&#xff0c;而无需修改该类型的源代码或创建新的派生类型。这种机制提供了一种更为灵活的方式…

Linux更改系统中的root密码

Linux里面的root密码忘记了怎么办&#xff1f; 1 更改系统中的 root 密码 &#xff08;1&#xff09;键盘 CtrlAltT 快捷键打开终端。 &#xff08;2&#xff09;在终端窗口中输入以下代码&#xff1a; sudo passwd root &#xff08;3&#xff09;输入锁屏密码 &#xf…

2024-05学习笔记

最近的学习大多都是和mysql的索引相关的 1.mvcc mvcc是不需要手动配置&#xff0c;是mysql的一个机制 在事务开启时&#xff0c;对涉及到的数据加一个隐藏列&#xff0c;隐藏列对应的值&#xff0c;就是事务id 如果当前是修改操作&#xff0c;就copy一份原来的数据到新的一行…