3.3垃圾收集算法

3.3垃圾收集算法

1、分代收集理论

①当前商业虚拟机的垃圾收集器大部分遵循了“分代收集”的理论,该理论建立在以下两个假说上

——弱分代假说:绝大多是对象都是朝生夕灭( ①早晨刚生,晚上就死亡。②形容事物生命短暂。)的

——强分代假说:熬过越多次垃圾收集的对象就越难以消亡

以上两种假说共同奠定了多款垃圾回收器一致的设计原则:

——收集器应该将java堆划分为多个不同的区域,将对象依据其年龄分配到不同的区域中去存储

②对象间不可能是孤立的,对象间会存在跨代引用

——跨代引用假说:跨代引用相对于同代引用仅占极少数

故不应该为了少量的跨代引用而去扫描整个老年代,只需在新生代建立一个全局的数据结构(记忆集)

这个结构会把老年代划分为若干小块并标记处那一小块存在跨代引用。

2、标记-清除算法

首先标记处将要被清除的对象,然后统一回收被标记的对象(当然也可以反过来标记存活的对象,清楚未被标记的对象)

缺点:①执行效率不稳定,当大部分都是垃圾时导致需要将垃圾全部标记(标记垃圾的情况)

②清除完成后会产生大量的不连续的内存空间,导致要为较大对象分配空间时会找不到足够且连续的空间

3、标记-复制算法    

将内存按容量划分为大小相等的两块,每次都只使用其中的一块,当这块内存用完之后就将还存活的对象移至空白内存中(规整的),再将已经使用过的内存整个清空。

优点:实现简单且高效

缺点:存活对象太多会需要进行大量复制且可用的内存降低至了原来的一半

针对对象的朝生夕灭的特点,有一种更优化的半区分代复制策略——Appel式回收

具体做法:把新生代分为一块较大的Eden区和两块较小的Survivor区(8:1:1)每次分配内存都只使用Eden区和一块Survivor区,回收时将存活对象移至空闲的survivor区中,并清除Eden和已使用的Survivor,

若对象复制过程中发现空闲的Survivor区不足以容纳全部存活对象就需要依赖其他区域(老年代)进行分配担保

4、标记-整理算法

将所有要被清除对象(或存活对象)标记,然后将所有存活对象想内存空间一端移动,然后直接清理掉边界以外的内存。

缺点:若存活对象太多,移动对象的代价将会很大


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值