点赞关注,不再迷路,你的支持对我意义重大!
🔥 Hi,我是丑丑。本文 「Android 路线」| 导读 —— 从零到无穷大 已收录,这里有 Android 进阶成长路线笔记 & 博客,欢迎跟着彭丑丑一起成长。(联系方式在 GitHub)
目录
前置知识
这篇文章的内容会涉及以下前置 / 相关知识,贴心的我都帮你准备好了,请享用~
Java 路线
虚拟机中的对象: Java 虚拟机 | 拿放大镜看对象
垃圾回收: Java 虚拟机 | 垃圾回收机制
Java 内存分配: Java 虚拟机 | 内存分配模型
Android 路线
程序执行: Android 虚拟机 | 从类加载到程序执行
内存指标: Android | 内存指标与测量方法
Android 垃圾回收: Android 虚拟机 | 垃圾回收机制
adj 进程优先级 (high)
Linux内核OOM killer机制:https://juejin.cn/post/6844903878178111502
- App 内存组成 & 限制(如何查看、监控)
- Dalvik & ART 内存分配与垃圾回收
1. 重新认识内存
1.1 什么是内存?
现代 Android 手机内存分为 运行时内存 RAM & 非运行时内存 ROM:
运行内存 RAM: 相当于 PC 中的内存条,是暂存 App 临时数据的存储介质。RAM 越大手机就能运行更多程序,且更佳流畅。考虑到体积和功耗,手机 RAM 不会使用 PC 中的 DDR RAM ,而是采用 LPDDR RAM(低功耗双倍数据速率内存);
非运行内存 ROM: 相当于 PC 中的磁盘,是持久化存储数据的存储介质。ROM 越大手机能存储更多数据。
提示:今天我们讨论的内存优化指 “运行内存优化”,而 “非运行内存优化” 我们将在 “存储优化” 专题中讨论。
1.2 内存优化的维度
分别针对上面提到的 RAM 和 ROM 两种内存,Android 内存优化是分为两方面的工作:
优化 RAM: 降低程序运行内存占用,防止程序发生 OOM,以及降低被 LMK 机制杀死的概率。同时不合理的内存使用会增大 GC 发生频率,从而导致程序卡顿;
优化包体积: Resource 资源、so 库以及 Dex 文件都会占用内存,包体积越大会占用更多运行内存;
1.3 内存优化的误区
对内存优化的错误认识需要注意规避,主要有:
- 内存占用越少越好?
内存优化不完全是追求于降低内存占用,当系统内存较充足 / 机型较高端的时候,我们完全可以多使用一些内存来换取更好的体验;而当系统内存不足 / 机型较低端的时候,我们应该更保守,做到 “用时分配,及时释放”。
- 本地(native)内存不用管?
本地内存是不受 Java 堆大小限制,例如 Android 8.0 就重新把 Bitmap 的图片数据放在本地内存。但也不能滥用本地内存,主要原因是当系统物理内存不足时,LMK 机制也会开始杀进程,内存占用越高越可能被杀死。
1.4 内存优化的意义
优化内存的意义可以归结为如下三点:
- 1、防止程序发生 OOM,提高应用稳定性;
- 2、减少 GC 频率,降低卡顿;
- 3、减少内存占用,降低被 LMK 机制杀死的概率。
需要注意的是,发生 OOM 的代码往往是 “压死骆驼的最后一棵稻草” ,但不一定是导致 OOM 的主要代码,完全可能只是刚好执行到这行代码发生 OOM。
1.5 内存的主要问题
理解了内存优化的重要性,那么内存优化到底要做什么呢?
- 内存抖动(memory thrashing)
主要表现为内存波动图形呈锯齿张,伴随着高频率 GC,导致程序卡顿。这个问题在 Dalvik 虚拟机上会更加明显,而 ART虚拟机在内存管理跟回收策略上都做了 大量优化,内存分配和GC效率相比提升了5~10倍,出现内存抖动的概率会小很多。
- 内存泄漏(memory leak)
主要表现为不再使用的无用对象无法被垃圾回收。这是因为 Android 虚拟机采用可达性分析算法来判定垃圾对象,当无用对象被生命周期更长的 GC Root 引用时,就会导致无法判定为垃圾对象而不会被回收,持续占用内存。
- 异常内存溢出(out of memory)
主要表现为程序抛出 OutOfMemoryError 异常奔溃。这是因为 Android 为每个应用分配了最大堆内存,当
即OOM,OOM时会导致程序异常。Android设备出厂以后,java虚拟机对单个应用的最大内存分配就确定下来了,超出这个值就会OOM。单个应用可用的最大内存对应于 /system/build.prop 文件中的 dalvik.vm.heapgrowthlimit。
此外,除了因内存泄漏累积到一定程度导致OOM的情况以外,也有一次性申请很多内存,比如说 一次创建大的数组或者是载入大的文件如图片的时候会导致OOM。而且,实际情况下 很多OOM就是因图片处理不当 而产生的。
- 内存分配异常
本文的着重点为第一点,总结概述降低应用运行内存的技巧。在这里我们不再细述PSS、USS等概念与Android应用的内存管理,如对这部分内容感兴趣,可自行阅读文末的参考文章。
2. Android 内存指标
- MAT
2.
2.3 三大内存问题
MAT
重要概念
incoming references
outgoing references
内存指标
当前设备内存占用情况 / 当前应用内存占用情况
ViewRootImpl 是Activity与Window的桥梁
参考资料
- 《Android 内存优化杂谈》 —— 张绍文 著
- 《Android 开发高手课 · 内存优化(上)》《下》 —— 张绍文著
- 《深入探索 Android 内存优化(炼狱级别 - 上)》《下》 —— JsonChao(平安)著
- 《必知必会 | Android 性能优化的方面方面都在这儿》 —— 鸿洋(懂车帝)著
- 《实践 App 内存优化:如何有序地做内存分析与优化》 —— 舒大飞(携程)著
- 《Android 内存优化之 OOM》 —— 胡凯 著 (多篇)
- 《Android 内存分析命令》 —— Gityuan(字节跳动)著
- 《Linux 内存管理》 —— Gityuan(字节跳动)著
https://developer.android.google.cn/topic/performance/memory-management
创作不易,你的「三连」是丑丑最大的动力,我们下次见!