Android GC 那点事

Android GC 那点事
最新回答
魔怪小姐

2021-04-24 18:16:30

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 Log

GC Log 包括 GC 原因、释放内存量、堆状态、暂停时间和总时间等信息,帮助分析卡顿问题。

### 总结

Android 的 GC 机制包括多种算法和优化策略,旨在高效管理内存资源。通过理解 GC 的原理、指标和类型,开发者可以优化应用性能,减少卡顿现象。ART 运行时引入的并发 GC 策略进一步提高了 GC 效率和应用响应性。