Android垃圾回收机制

本文探讨了Java中判断对象是否可回收的两种方法:引用计数法和可达性分析算法,以及不同类型的垃圾回收算法,如复制、标记清除和标记整理。重点介绍了新生代和老年代的内存分配策略及一次完整GC流程。
摘要由CSDN通过智能技术生成

可回收对象的判定

         判断一个对象是否可回收对象,有两种典型方法:

        (1)引用计数法: 简单高效, 容易有循环引用

        (2)可达性分析算法:即从GC Roots作为起点,向下搜索它们引用的对象,生成一棵引用树,树的节点视为可达对象,反之视为不可达。

Java语言定义了如下GC Roots对象(每种具体实现对GC Roots有不同的定义):

虚拟机栈(帧栈中的本地变量表)中引用的对象。

方法区中静态属性引用的对象。 

方法区中常量引用的对象

本地方法栈中JNI引用的对象

垃圾回收算法

        1.复制算法将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉。

        特点:简单高效无碎片, 内存利用率只有一半

        2.标记清除算法:先标记可回收对象,然后统一清除。

        特点: 效率不稳定;容易产生碎片,导致提前gc。 不适合朝生夕死的新生代,适合于老年代。

        3. 标记整理算法:标记要清除的对象不是直接回收, 二是将存活对象都向一端移动,然后清理掉端边界以外的内存。

        特点: 对象移动、引用更新比较耗时,效率较低,但无内存碎片。

一次完整GC流程

        (1)对象优先在新生代eden区分配

        (2)大对象直接进入老生代

        (3)新生代使用复制算法进行垃圾回收时,实际不是1:1分成两块,而是8:1:1分成eden、from、to三块。因为绝大部分对象都会被快速回收,需要进入from或to空间的不多。之所以有from、to两个小块,是因为部分对象可能在进入老生代前多次gc都不释放,那2次gc、3次gc就可以在from和to块中进行复制移动。

        (4)新生代会在退出Activity5到6秒就触发gc; 老生代仅在内存不足时释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值