垃圾回收算法——复制式回收

复制式垃圾回收算法通过将堆分为两个半区,提高分配速度并减少内存碎片。在回收过程中,存活对象从来源空间复制到目标空间,然后丢弃来源空间。虽然分配快速,但因可用空间减半,可能导致更频繁的回收。此外,移动对象可能带来额外开销,并影响程序性能。局部性和回收频率是选择垃圾回收策略的重要考量因素。
摘要由CSDN通过智能技术生成
   标记-清扫回收地开销较低,但其可能受到内存碎片问题地困扰。在一个设计良好地系统中,垃圾回收通常只会占用整体执行时间地一小部分,赋值器地执行开销将决定整个程序的性能,因此应当设法降低赋值器的开销,特别是应当尽量提升它的分配速度。标记-整理回收器可以根除碎片问题,而且支持极为快速的“阶跃指针”分配,但它需要多次堆遍历过程,进而显著增加了回收时间。

半区复制算法:
该算法属于追踪式回收算法。回收器在复制过程中会进行堆整理,从而可以提升赋值器的分配速度,且回收过程只需对存活对象遍历一次。其最大的缺点在于堆的可用空间降低了一半。

1.半区复制回收

基本的复制式回收器会将堆划分为两个大小相等的半区,分别是来源空间和目标空间。当堆空间足够时,在目标空间中分配新对象的方法是根据对象大小简单地增加空闲指针,如果可用空间不足,则进行垃圾回收。回收器在将存活对象从来源空间复制到目标空间之前,必须先将两个半区的角色互换。在回收过程中,回收器简单地将存活对象从来源空间中迁出;在回收完成后,所有存活对象将紧密排布在目标空间地一端。在下一轮回收之前,回收器将简单地丢弃来源空间(以及其中的对象),但在实际应用中基于安全考虑,许多回收器在初始化下轮回收过程之前都会先将该区域清零。
与标记-整理回收不同,半区复制回收无须在对象头部引入额外空间。由于来源空间中的对象在复制完成后便不再使用,所以其每个槽都可以用于记录转发地址(至少在万物静止式回收中如此)。因此复制式回收甚至适用于不包含头部的对象。

2.遍历顺序与局部性

赋值器和回收器的局部性对程序性能有重要影响。如果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值