Android GC 那点事本文主要探讨 Android 内存管理和垃圾回收(GC)机制的原理与应用。以解决魅族手机图片滑动卡顿问题为出发点,深入分析了 JVM 内存回收机制,包括回收算法、Dalvik 虚拟机的 Java 堆、GC 的类型、对象的分配与触发时机,以及 ART 运行时内存回收机制的差异。### JVM 内存回收机制#### 回收算法1. **标记回收算法**:从根节点开始遍历,保留可达对象,其余视为垃圾回收。2. **复制算法**:将内存空间分为两块,每次只使用其中一块,复制存活对象到未使用的内存块,清理原内存块。3. **标记-压缩算法**:标记所有可达对象后,将存活对象压缩到内存一端,清理边界外空间。4. **分代回收**:新生代使用复制算法,老生代使用标记-压缩算法。#### 复制与标记-压缩算法的区别复制算法用空间换时间,标记-压缩算法用时间换空间。复制算法不产生内存碎片,而标记-压缩算法可能产生碎片。### Dalvik 虚拟机#### Java堆Java堆由 Active 堆和 Zygote 堆组成,Active 堆用于应用程序进程,Zygote 堆用于预加载对象。通过 Cow 策略避免对象复制。#### GC 相关指标关注 Java 堆的起始大小、最大值和增长上限值。通过-Xms、-Xmx 和 -XX:HeapGrowthLimit 控制这些值,确保堆内存合理利用。### GC 的类型与时机#### GC 类型GC_FOR_MALLOC、GC_CONCURRENT 和 GC_BEFORE_OOM 在对象分配过程中触发。并发和非并发 GC 的主要区别在于非并发 GC 挂起非 GC 线程,而并发 GC 在挂起与唤醒非 GC 线程之间进行。#### 对象分配与触发时机轻量级内存分配失败时触发 GC。如果 GC 线程正在运行,则等待 GC 结束;否则执行 GCForMalloc。再次尝试分配后触发 GC_CONCURRENT。### ART 内存回收机制#### Java堆ART 使用 Image Space、Zygote Space、Allocation Space 和 Large Object Space 管理内存,Large Object Space 用于高效分配大对象。#### GC 类型与并发ART 根据内存需求选择并发或非并发 GC,以提高响应性和内存管理效率。并发 GC 简化对象遍历并减少暂停时间。### GC LogGC Log 包括 GC 原因、释放内存量、堆状态、暂停时间和总时间等信息,帮助分析卡顿问题。### 总结Android 的 GC 机制包括多种算法和优化策略,旨在高效管理内存资源。通过理解 GC 的原理、指标和类型,开发者可以优化应用性能,减少卡顿现象。ART 运行时引入的并发 GC 策略进一步提高了 GC 效率和应用响应性。