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

聊聊一些垃圾回收算法

作者头像
哒呵呵
发布2018-08-06 14:56:53
2560
发布2018-08-06 14:56:53
举报
文章被收录于专栏:鸿的学习笔记

不是所有的GC都是完美的,每一个GC算法的选用都有其背后的原因。而我们选择GC算法,有四个评价标准:吞吐量(也就是说,在单位时间内你回收的对象(这里是指通过应用程序获取的数据集合)多少),最大暂停时间(要执行GC意味着,应用程序必须会发生短暂的暂停,这个评价的就是暂停时间的大小),堆使用效率(这是指GC在堆中存放的信息大小,GC过程中使用的能力),访问的局部性(这个来源于硬件,是否把具有引用关系的对象安排在堆中较近的对象)。 1.标记-清除算法 这个是最老的算法了,来源于简单的思想,把活动的对象使用一定空间递归的先打上一个标记,最后在清除阶段将没有打上标记的数据删除。在标记阶段可以使用深度优先搜索,也可以使用广度优先搜索,当然这两个算法的核心在于队列的使用。回收后,当然还需要再使用,这时候就会把这些数据用链表连接起来形成一个空闲链表。这样就会导致碎片化的分块,就和windows的文件系统一样。 2.引用计数 既然GC是一种让没有引用对象的对象离去的机制,那么为啥不让所有对象事先记录下有多少程序引用自己,然后没有引用的对象消失。这就是引用计数,来源于自然而然的想法。这个算法引入了计数器的概念。但是这个算法的实现却不是那么简单,因为我们要考虑到每个对象的更新,而不是简单的赋值了。计数器本身的增减会带来时间上的消耗,计数器本身也会占用内存。不过优点也很明显,可以即刻回收垃圾,最大暂停时间也会变少,并且没有了遍历对象的过程,这个在分布式的环境下尤为有利。 3.GC复制算法 这个算法简而言之就是,把所有活动对象复制到另一个空间To,在把原空间From的所有对象删除。因为只复制和搜索活动对象,这意味着和1所提到的标记-清除算法,GC的暂停时间减少了,对于空闲链表的分配也更加得心应手,毕竟再也没有分块的担忧了,碎片化的问题也获得了解决,有得必有失,GC复制算法也极大的消耗了堆空间。

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

本文分享自 鸿的学习笔记 微信公众号,前往查看

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

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

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