前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GC算法-分代垃圾回收

GC算法-分代垃圾回收

作者头像
烟草的香味
发布2020-04-26 13:28:19
2570
发布2020-04-26 13:28:19
举报

概述

分代垃圾回收并不是一个新的算法, 而是将之前的回收算法结合利用, 分场景使用.

简单来说, 分代垃圾回收的思路, 就是给每个对象都分配一个年龄, 年龄越大的, 活的越久, 被回收的概率就越小. 经验表明, 大部分对象在生成后马上就成了垃圾.

也就是说, 年轻人要多运动, 没事的时候多看看, 常回收. 老年人好静, 一般不去惊扰他老人家.

分代垃圾回收就是利用这个现象, 将堆分为了新生代老年代, 新生代的对象大部分会马上变成垃圾, 而新生代经历过几次回收后, 对象就会晋升到老年代中. 老年代中的对象不会经常回收. 然后, 就可以针对不同分代, 利用针对性的GC算法.

实现

还记得之前的标记复制算法么? 将堆进行二等分. 在分代回收中, 也将堆进行分块, 分为新生代堆以及老年代堆.

针对新生代: 利用复制算法, 避免了内存碎片化, 同时分配内存更快速(因为新生代就是会频繁的申请内存). 同时将年龄大的对象加到老年代中.

当然, 在针对新生代复制中, 因为要通过根集合遍历所有活动对象, 也就是要对所有对象进行遍历, 为了减少遍历次数, 通过维护一个集合(保存所有老年代中引用了新生代对象的指针), 这样就能减少对象的遍历.

针对老年代: 直接使用标记清除即可.

分析

通过对不同的对象有针对性的执行算法, 结合了不同算法的优点. 使得其吞吐量得到改善.对回收频繁的内存, 使用复制算法 速度快、内存分配也高效.

但是, 如果有的程序并并不符合年纪轻轻就死掉的规则, 一个程序的大部分对象都能够活很久, 那就适得其反了.

当然也不只有新生老年两代, 也可以有多代.


针对分代垃圾回收就简单说一下, 因为JVM用的就是它, 网上一找一大把, 简直太多了.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 烟草的香味 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档