Android 经典垃圾回收算法

本文介绍了Android系统中的垃圾回收(GC)机制,基于Mark-Sweep算法,详细阐述了GC的三个步骤:标记、遍历对象和清理。讨论了GC触发的时机,包括堆内存满、特定阀值、开发者请求和系统调用gc()。还解释了GC Root的重要性,并列举了Dalvik VM中的GC Root元素,如系统类、线程、全局JNI引用等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Garbage Collection (垃圾回收)简单的来说是一种自动化的内存管理机制。Android系统中不管是Dalvik 或Art 它们使用的垃圾回收机制都是以Mark-Sweep为根基演变过来的。

Mark的意思是“标记” 在这里表示遍历处理内存中的对象,并处理统计,对应的Sweep的意思是清理,根据Mark出来的对象完成垃圾回收。

Mark-Sweep总共分三个步骤:

1、系统中所有Objects 对应的Mark bit 都会被清空。

2、Mark 阶段。从GC Root开始遍历系统中所有的对象——只要从“根”开始有一条路径可以达到某个Object,那么我们就可以将它的状态标记为“被引用”,或者更直白的说 “还有利用价值”。

3、系统开始线性的处理堆中的所有元素,并将那些没有被标记为“有利用价值”做Sweep 处理。

 

下面我们针对上面的说法进行补充说明

GC出发时机:

我们首先知道,java是有指针的,java的指针属于智能指针(想了解的话可以去查下资料,后期我会对智能指针进行补充)实现内存自动化管理。对象引用每次变更都需要调整计数,直到Count值为 0 时才回收内存——GC触发条件是 Count 值为 0。相对Reference Counting  ,GC采用的触发方式在某种程度上效率更高,因为它不需要频繁的对各对象调整计数值,而是选择在某种特定情况下进行处理。

在Android 中发生GC的场景有下面几种:

(1)、堆内存已满(GC_FOR_MALLOC)而你尝试去分配新内存的情况。

(2)、当堆内超过某个特定的阀值(GC_CONCURRENT)时,触发

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值