Android的GC机制

 

GC:Garbage Collector

 

GC算法的核心思想

Android虚拟机采用根搜索算法和程序计数器算法。GC会从根节点(GC Roots)开始对heap(堆)进行遍历。到最后,部分没有直接或者间接引用到GC Roots的就是需要回收的垃圾,会被GC回收掉对堆内存中的对象进行识别,如果对象正在被引用则称其为存活对象, 如果对象不再被 引用,则称为垃圾对象,可以收回其占据的空间,用于再分配。

 

GC优先级

没有引用的对象-------->虚引用--------->弱引用-------->软引用-------->强引用(默认)

 

 

GC触发的条件

JVM进行GC的频率很高,但因为这种GC占用时间极短,所以对系统影响不大。

但 主GC 对系统影响明显,触发 主GC 的条件

1.应用程序空闲时,GC会被调用

主动被调用。GC在优先级最低的线程中进行

2.堆内存不足时,GC会被调用

被动被调用。JVM强制调用GC线程,若调用一次仍不能满足内存分配要求,JVM 会在调用两次GC进行尝试,如果还是不能满足需求则JVM报出“Out of Memory”

由于是否进行主 GC由JVM根据系统环境决定,所以主GC运行具有不确定性

 

GC存在的目的

有效防范动态内存分配中因为内存垃圾过多而引发的内存泄漏和不恰当的内存释 放 造成的内存非法引用

 

 

减少 主GC 开销措施

1.不要显示的调用System.gc()

虽然此函数建议JVM进行主GC,但经常会触发主GC的执行,增加了间歇性停 顿的次数

2.减少临时对象的使用

临时对象在跳出函数调用后会成为垃圾,少用临时对象就相当于减少垃圾的产生从而延长了堆内存不足事件发生的时间,减少主GC的机会

3.对象不用时显示的置为NULL

为NULL的对象都会被作为垃圾处理,有利垃圾回收器判定垃圾,提高GC效 率

4.尽量使用StringBuffer而不是String进行累加字符串

5.能用int,long基本数据类型而不使用Integer,Long对对象

6.少使用静态对象变量

静态变量属于全局变量,不会被垃圾回收器回收

7.分散对象创建和删除时间

短时间创建大量对象会需要大量内存空间,JVM只能调用主GC回收内存,整合内存碎片。短时间内删除大量对象产生大量垃圾对象,增加了下次创建新对象时强制主GC的机会