问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Android 性能优化:内存优化实践指南

创作时间:
作者:
@小白创作中心

Android 性能优化:内存优化实践指南

引用
CSDN
1.
https://blog.csdn.net/qq_27948659/article/details/144913578

内存优化是Android应用开发中非常重要的一环,它不仅关系到应用的性能和用户体验,还直接影响到应用的稳定性和可靠性。本文将从内存检测工具的使用、OOM问题的常见原因及解决方案、业务优化策略等多个方面,详细介绍Android内存优化的具体实践方法。

1. 内存构成概述

在进行内存优化之前,首先需要了解Android应用的内存构成。Android应用的内存主要由以下几个部分组成:

  • Java:从Java或Kotlin代码分配的对象的内存。
  • Native:从C或C++代码分配的对象的内存。
  • Graphics:图形缓冲区队列为向屏幕显示像素(包括GL表面、GL纹理等)所使用的内存。
  • Stack:应用中的原生堆栈和Java堆栈使用的内存。
  • Code:应用用于处理代码和资源(如dex字节码、经过优化或编译的dex代码、.so库和字体)的内存。
  • Others:应用使用的系统不确定如何分类的内存。
  • Allocated:应用分配的Java/Kotlin对象数。

2. 内存检测工具

常用的内存检测工具有以下三种:

2.1 LeakCanary

LeakCanary是一个自动化内存泄漏检测工具,集成简单,主要用于线下集成。虽然使用了idleHandler与多进程,但dumphprof的SuspendAll Thread特性依然会导致应用卡顿。它只能自动检测Activity、Fragment和其他常见组件的内存泄漏,对于某些复杂情况下的泄漏,需要开发者手动检查和分析。

2.2 Memory Profiler

Memory Profiler是Android Studio中内置的一个强大工具,主要包括NetWork、CPU和Memory Profiler部分。对于Mac M2以上的开发环境,建议深度使用。Memory Profiler可以显示堆内存的实时使用情况,包括Java堆、Native堆和其他内存占用。

Memory Profiler会展示出类的列表,对于每个类,显示实例数量、Native Size、Shallow Size和Retained Size:

  • Shallow Size:对象本身消耗的内存大小
  • Native Size:类对象所引用的Native对象所消耗的内存大小
  • Retained Size:一旦删除对象,其余无法访问的内存大小

2.3 Memory Analyzer (MAT)

MAT是一个强大的分析工具,用于查找Java应用程序中的内存泄漏并分析内存使用情况。可以使用命令行或Android Studio中生成堆转储(Heap Dump)。在MAT窗口上,OverView是一个总体概览,显示总体的内存消耗情况和疑似问题。MAT提供了多种分析维度,其中Histogram、Dominator Tree、Top Consumers和Leak Suspects的分析维度是不同的。

分析内存最常用的是Histogram和Dominator Tree这两个视图,视图中一共有四列:

  • Class Name:类名
  • Objects:对象实例个数
  • Shallow Heap:对象自身占用的内存大小
  • Retained Heap:当前对象大小与当前对象可直接或间接引用到的对象的大小总和

3. OOM常见问题及解决方案

导致App发生OOM和内存占用过高主要分为以下几个方面:

  1. Bitmap内存占用:大尺寸图片资源,未合理的对图片进行裁剪缩放和缓存,导致内存占用高
  2. 内存泄露:内存中有对象的引用无法被释放,导致这些对象无法正常被回收,最终导致内存耗尽
  3. 内存溢出:Android应用存在固定内存限制,超过一定数量会导致程序崩溃
  4. 内存抖动:内存频繁分配和回收导致内存出现锯齿抖动的现象
  5. 过多线程开辟:大量创建线程,或线程池资源未正确管理,可能会占用大量内存

3.1 Bitmap内存占用优化

Bitmap内存占用是直播多媒体App中占比最高的部分,主要优化方法包括:

  • 使用Glide或Picasso等图片加载库
  • 手动压缩图片大小和图片质量
  • 使用LruCache或DiskLruCache进行缓存

3.2 Bitmap图片大小监控

可以通过自定义ImageView或在图片加载成功后添加检测Bitmap尺寸是否过大的方式来监控Bitmap大小。此外,还可以使用ASM字节码插桩和Native Hook等技术手段进行监控。

3.3 内存泄露、内存抖动和内存溢出优化

内存泄露优化主要包括减少内类间接持有context或Fragment对象、动画处理、注册对象注销、WebView内存泄漏处理、类的静态变量处理等。内存抖动优化则需要合理使用缓存池,减少不合理对象的创建,使用合理数据结构等。

3.4 过多线程开辟优化

可以通过全局使用统一线程池、使用Kotlin Coroutines、避免并发任务过多等方式进行优化。

4. 业务优化

在技术维度优化外,还可以结合业务优化,如设备分级和业务降级策略。设备分级可以根据CPU、内存等硬件信息划分版本年代,业务降级则可以根据设备等级调整资源加载策略。

5. 线上监控和告警体系搭建

推荐使用Koom的线上内存泄漏检测方案,包括Java Heap泄漏监控、Native Heap泄漏监控和Thread泄漏监控。有了APM工具,就可以依据Koom的结果进行上报,根据上报日志,定制不同业务域的内存泄露告警。

总结

内存优化是一个系统工程,需要从多个维度进行综合考虑和优化。通过合理的工具使用、代码优化和业务策略调整,可以有效提升应用的内存使用效率和稳定性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号