探索 Android 内存优化方法


探索 Android 内存优化方法

文章插图
前言
这篇文章的内容是我回顾和再学习 Android 内存优化的过程中整理出来的 , 整理的目的是让我自己对 Android 内存优化相关知识的认识更全面一些 , 分享的目的是希望大家也能从这些知识中得到一些启发 。
Android 应用运行在 Dalvik 虚拟机上 , 而 Dalvik 虚拟机是基于 JVM 优化而来的 , 因此只有了解了 JAVA 的内存管理机制 , 才能更好地理解 Android 的内存管理机制 , 如果你对这一块还不熟悉的话 , 可以看我的上一篇文章 探索 Java 内存管理机制 。
本文的内容可分为两部分 , 第一部分讲的是 Android 内存管理机制相关的一些知识 , 第二部分讲的是内存问题的解决与内存优化方法 , 大家可以根据自己的需要选择性地阅读 。
1. 为什么要做内存优化?
内存优化就是对内存问题的一个预防和解决 , 做内存优化能让应用挂得少、活得好和活得久 。
  • 挂得少 “挂”指的是 Crash , 假如一个满分的应用是 100 分 , 那么一个会 Crash 的应用在用户心里会扣掉 90 分 。就像是我们在一家店吃到了一盘很难吃的小龙虾 , 哪怕别人说这家店再好吃 , 我们以后都不想吃这家店了 。导致 Android 应用 Crash 的原因有很多种 , 而做内存优化就能让我们的应用避免由内存问题引起的 Crash 。内存问题导致 Crash 的具体表现就是内存溢出异常 OOM , 引起 OOM 的原因有多种 , 在后面我会对它们做一个更详细的介绍 。
  • 活得好 活得好指的是使用流畅 , Android 中造成界面卡顿的原因有很多种 , 其中一种就是由内存问题引起的 。内存问题之所以会影响到界面流畅度 , 是因为垃圾回收(GC , Garbage Collection) , 在 GC 时 , 所有线程都要停止 , 包括主线程 , 当 GC 和绘制界面的操作同时触发时 , 绘制的执行就会被搁置 , 导致掉帧 , 也就是界面卡顿 。关于 GC 的更多介绍 , 可以看我的上一篇文章 。
  • 活得久 活得久指的是我们的应用在后台运行时不会被干掉 。Android 会按照特定的机制清理进程 , 清理进程时优先会考虑清理后台进程 。清理进程的机制就是低杀 , 关于低杀在后面会有更详细的介绍 。假如现在有个用户小张想在我们的电商应用买一个商品 , 千辛万苦挑到了一个自己喜欢的商品后 , 当他准备购买时 , 小张的老婆叫他去给孩子换尿布 , 等小张再打开应用时 , 发现商品页已经被关闭了 , 也就是应用被干掉了 , 这时小张又想起了孩子的奶粉钱 , 可能就放弃这次购买了 。用户在移动设备上使用应用的过程中被打断是很常见的 , 如果我们的应用不能活到用户回来的时候 , 要用户再次进行操作的体验就会很差 。
2. 什么是 Dalvik?
要了解 Android 应用的内存管理机制 , 就要了解承载着 Android 应用的虚拟机 Dalvik , 虽然 Android 现在是使用的 ART 来承载应用的执行 , 但是 ART 也是基于 Dalvik 优化而来的 。
Dalvik 是 Dalvik Virtual machine(Dalvik 虚拟机)的简称 , 是 Android 平台的核心组成部分之一 , Dalvik 与 JVM 的区别有如下几个 。
2.1 Dalvik 与 JVM 的区别
  • 架构 JVM 是基于栈的 , 也就是需要在栈中读取数据 , 所需的指令会更多 , 这样会导致速度慢 , 不适合性能优先的移动设备 。Dalvik 是基于寄存器的 , 指令更紧凑和简洁 。由于显式指定了操作数 , 所以基于寄存器的指令会比基于栈的指令要大 , 但是由于指令数的减少 , 总的代码数不会增加多少 。
  • 执行代码不同 在 Java SE 程序中 , Java 类会被编译成一个或多个 .class 文件 , 然后打包成 jar 文件 , JVM 会通过对应的 .class 文件和 jar 文件获取对应的字节码 。而 Dalvik 会用 dx 工具将所有的 .class 文件转换为一个 .dex 文件 , 然后会从该 .dex 文件读取指令和数据 。

探索 Android 内存优化方法

文章插图