Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )

简介: Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )

文章目录

一、 内存优化总结

二、 常见的内存泄漏场景

三、 内存回收算法

四、 标记-清除算法 ( mark-sweep )

五、 复制算法

六、 标记-压缩算法





一、 内存优化总结


内存泄漏原理 : 长生命周期对象 , 持有短生命周期对象的引用 , 并且是强引用持有 , GC 无法释放该短生命周期对象引用 , 造成 OOM ;


Android Profiler 工具参考官方文档 : 使用 Memory Profiler 查看 Java 堆和内存分配



使用 Memory Analyzer ( MAT ) 内存分析工具分析内存快照 , 首先要将内存快照文件 , 转化成 MAT 工具能识别的文件 , 然后使用 MAT 工具进行分析 ;



在博客 【Android 内存优化】Android Profiler 工具常用功能 ( 监测内存 | 内存快照 ) 中保存了内存快照文件 memory-20200625T145636.hprof , 要使用 MAT 工具分析该内存快照 , 需要先将该文件转换成为 MAT 标准的文件格式 ;



在博客 【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( hprof 文件转换 | MAT 工具下载 | MAT 工具使用 ) 中转换了 MAT 格式的内存快照 , 下载 Memory Analyzer ( MAT ) 内存分析工具 , 并在该工具中加载了 MAT 格式的文件 ;



在博客 【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( MAT 工具使用 | 最大对象 | 类实例个数 | 引用与被引用 | GC Roots 最短链 ) 中 使用 Memory Analyzer ( MAT ) 内存分析工具 中分析内存快照 , 主要是查看 GC Roots 最短链 , 分析出在哪个类中引用了该对象 ;






二、 常见的内存泄漏场景


内存泄漏的常见原因 :


集合的使用

静态成员

常量

单例模式 : 不要在单例中随便持有 Context , Activity 之类的成员 , 有极大的内存泄漏隐患 ;

没有释放或关闭的资源 : 如 IO 流 , Socket 等 ;

线程 : 界面退出 , 线程没有退出 , 线程持有的引用就泄漏了 ; 尽量在其中使用弱引用 ;

Handler : 非静态内部类造成内存泄漏 ;





三、 内存回收算法


1. 内存抖动 : 应用对象的内存 , 频繁的分配 , 回收 , 造成内存使用量上下抖动 , UI 卡顿 , 严重时甚至造成 OOM ( OutOfMemoryError ) , 造成内存溢出 ;



2. 内存抖动造成溢出原因 : 对象频繁分配 , 回收 , 会大量造成内存的空隙 , 这些空隙很小无法分配大块内存 , 当整个内存都是这种空隙时 , 无法为大块内存分配空间 , 就造成了 OOM 异常 ;



3. GC 垃圾回收之前 , 需要对内存对象进行采集 , 不同的虚拟机使用不同的垃圾回收算法 , 常用的垃圾回收算法 :


标记-清除算法 ( mark-sweep )

复制算法

标记-压缩算法

分代收集算法





四、 标记-清除算法 ( mark-sweep )


标记-清除算法 ( mark-sweep ) : 步骤分为两步 : ① 标记 , ② 清除 ;



内存中分为如下几块 :


可回收对象

存活对象

可用内存


标记-清除算法 ( mark-sweep ) 算法中 , 首先标记出可回收对象 , 标记完成之后 , 统一回收 ;


回收完毕后 , 存活的对象仍然保持在原来的位置 , 可用内存基本支离破碎 , 这样就会造成内存碎片 , 这些内存碎片中无法申请大块内存 ;


image.png


上图中的内存中 , 有 24 个格子的空闲内存 , 如果要申请 5 55 个单位格子的内存 , 发现无法申请 , 没有连续 5 个格子的内存 , 此时直接出现 OOM ;


有很多内存, 但都是支离破碎的 , 没有大块内存 ;






五、 复制算法


1. 复制算法 : 将可用内存 , 分为两个想等于内存区域块 , 区域 1 11 和 区域 2 22 , 使用时只使用其中的一个区域 ;


垃圾回收前 , 只使用区域 1 11 的内存

垃圾回收后 , 将区域 1 11 的内存中可用对象复制到区域 2 22

复制时的可用对象在区域 2 22 紧密排列 , 不留空隙

这样区域 2 22 中可用内存区域是大块完整的内存 , 不会产生内存碎片


当前使用区域 1 11 的内存区域内存不足时 , 会触发上述操作 , 将当前区域 1 11 的存活对象 , 拷贝到区域 2 22 中 , 然后清理区域 1 11 内存 ;


分配回收内存时 , 只需要按照顺序移动堆指针即可 , 不考虑碎片化等问题 , 简单 , 高效 ;




2. 弊端 :



该垃圾回收算法缺陷也很明显 , 就是会浪费一半内存空间 ;


有些对象的声明周期等同于应用声明周期 , 如 Android 中的 Application 等 , 该内存对象根本不释放 , 持续往返复制这类长生存期的对象 , 会极大降低效率 ;




image.png




六、 标记-压缩算法


1. 标记压缩算法 : 与标记清除算法都需要先进行标记 ;



2. 标记压缩算法流程 :


首先标记可回收对象

然后回收这些对象

最后整理存活对象 , 将其拷贝到一块连续内存中


该方法没有复制算法浪费一半内存的问题 ;


该方法因为多了一个压缩过程 , 因此有额外的开销 ;

image.png


目录
相关文章
|
算法 安全 Java
即时通讯安全篇(一):正确地理解和使用Android端加密算法
本文主要讨论针对Android这样的移动端应用开发时,如何正确的理解目前常用的加密算法,为诸如即时通讯应用的实战开发,如何在合适的场景下选择适合的算法,提供一些参考。
625 0
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
1471 1
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点展示了如何使用 Kotlin 实现 AES-256 的加密和解密,提供了详细的代码示例。
899 2
|
算法 Java API
记录我第一次在Android开发图像处理算法的经历
记录我第一次在Android开发图像处理算法的经历
199 1
|
并行计算 安全 算法
Java面试题:Java内存管理与多线程并发处理,设计一个Java应用,该应用需要处理大量并发用户请求,同时要求对内存使用进行优化,如何通过垃圾回收机制优化内存使用?
Java面试题:Java内存管理与多线程并发处理,设计一个Java应用,该应用需要处理大量并发用户请求,同时要求对内存使用进行优化,如何通过垃圾回收机制优化内存使用?
236 0
|
存储 缓存 算法
详解JVM内存优化技术:压缩指针
详解JVM内存优化技术:压缩指针
|
缓存 监控 Android开发
Android 开发中的内存优化策略
【5月更文挑战第30天】在移动应用的开发过程中,性能和用户体验始终是核心关注点。对于基于Android平台的应用程序,有效的内存管理是确保流畅运行和优异性能的关键因素之一。本文将深入探讨Android开发中常见的内存问题,并提出一系列实用的内存优化策略。我们将从内存泄漏的识别与防止开始,到合理使用内存缓存技巧,以及高效的数据结构选择等方面进行详细阐述。通过这些策略的实施,开发者可以显著减少应用的内存占用,提升应用的稳定性和响应速度,进而改善最终用户的体验。
|
缓存 监控 Java
安卓开发中的内存优化策略
【5月更文挑战第28天】 在移动应用开发领域,特别是针对资源受限的安卓平台,内存优化是提升性能和用户体验的关键因素之一。本文将深入探讨安卓应用开发过程中常见的内存问题,并提出一系列实用的内存优化策略。从理解安卓内存管理机制出发,到代码层面的具体实践,文章旨在为开发者提供一套系统的内存优化工具和思路,以帮助其开发出更加高效、稳定的安卓应用。
|
存储 Java Android开发
安卓开发中的内存优化策略
【5月更文挑战第28天】在移动应用开发中,性能和用户体验是至关重要的。特别是对于安卓应用,由于设备的硬件配置多样化,内存管理成为提升应用性能的一个关键点。本文将深入探讨针对安卓平台的内存优化技术,包括内存泄漏的预防、合理的数据结构选择、以及有效的垃圾回收策略。通过对这些技术的阐述和实例分析,旨在为开发者提供一套实用的内存优化工具和方法,帮助他们开发出更加流畅和高效的安卓应用。
|
监控 安全 网络安全
网络安全与信息安全:防护之道与加密技术构建高效Android应用:从基础到高级的内存优化策略
【5月更文挑战第27天】在数字化时代,数据成为了新的货币。然而,随着信息技术的蓬勃发展,网络安全漏洞和信息泄露事件层出不穷,对个人隐私和企业安全构成了严重威胁。本文将深入探讨网络安全的重要性,分析当前常见的网络攻击方式,并重点分享关于加密技术和提升安全意识的知识。通过阅读本文,读者将获得如何有效防御网络威胁、保护个人和企业信息安全的策略。