四、垃圾收集之垃圾收集算法
博客专区 > Swimmer 的博客 > 博客详情
四、垃圾收集之垃圾收集算法
Swimmer 发表于1年前
四、垃圾收集之垃圾收集算法
  • 发表于 1年前
  • 阅读 10
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

一、标记-清除算法

  1. 最基础的收集算法,其余的算法基本都是由此算法改进得来
  2. 效率不高,标记和清除的过程效率都不高
  3. 清除之后会产生大量的不连续的内存碎片

 

二、复制算法

  1. 为了解决标记-清除算法的效率问题而出现的复制算法
  2. 将内存分为两块,一个半区用于放对象,另一个半区是空的
  3. 垃圾回收时将放置对象的半区中未被标记死亡的对象放到空半区
  4. 这样的好处在于实现简单,运行高效
  5. 缺点是牺牲了一般的内存空间,代价太大

 

三、现在的复制算法

  1. HotSpot虚拟机采用Eden-Survivor分区的方式
  2. 将内存分为Eden空间和两块Survivor空间,大小为8 : 1 : 1
  3. 回收时将Eden空间和一块Survivor空间中还存活的对象复制到另一个Survivor空间中
  4. 这样做的原因是因为:98%的新生代都是“朝生夕死”的,所以每次回收的时候可以将存活的对象放到较小的一块区域
  5. 当另一块Survivor空间没有大小不够时,虚拟机会通过分配担保机制将这些对象划进老年代

四、标记-整理算法

  1. 在老年代中一般都是存活时间比较长的对象,所以不适合使用复制算法进行回收(基本不会“朝生夕死”)
  2. 标记-整理算法会将所有存活的的对象都像一端移动,然后清理掉边界以外的内存

五、分代回收算法

  1. 当前商业虚拟机的垃圾收集都采用分代回收算法
  2. 将内存划分为几块,一般是把java堆分成新生代和老年代,根据各个年龄代的特点,选择不同的算法进行回收
  3. 新生代一般是“朝生夕死”,所以采用复制算法,高效且不需要很大的空闲内存
  4. 老年代的对象存活率高,所以使用标记-清除算法或者标记-整理算法
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 2
博文 30
码字总数 12958
×
Swimmer
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: