前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >漫画 | 垃圾回收实在是太垃圾了!

漫画 | 垃圾回收实在是太垃圾了!

作者头像
腾讯大讲堂
发布2021-08-24 10:40:11
6130
发布2021-08-24 10:40:11
举报

1960年,人工智能之父 John McCarthy 在麻省理工大学做了一次重要演示

Lisp的担心很快就变成了现实

垃圾回收虽然在卖力工作,可是系统还是恢复不了。

在编程的世界中,内存分配每时每刻都在发生,从底层来讲,可以分为三类。

而Lisp中所有的数据都是“表”(List),都是在堆中动态分配的,如果它不支持GC,程序员管理表(List)估计就会疯掉。

为此, John McCarthy于1960年发表了一篇论文,提出了标记-清除算法。

算法分为两个阶段, 第一个阶段是标记, 从一个GC root集合出发,沿着“指针”找到所有活动对象

到了清除阶段,只需要把那些没有被标记的对象删除,释放空间就行。

标记-清除算法非常简单,容易实现,现在垃圾收集算法都是它的思想的延续。

仅此一点,McCarthy就可以成为GC算法之父。

可是标记-清除算法也有两个要命的缺点:分配速度慢,容易产生碎片。

为了解决这个问题, 1963年, 另外一位人工智能之父”的Marvin L. Minsky提出了著名的复制算法

Minsky 的复制算法需要把整个空间平均分成两部分, 先在From空间进行分配,当From空间被占满,GC将活动对象复制到To空间, 复制完成后, From和To进行互换。

复制算法的第一步也是标记,但是找到活动对象以后,直接复制到另一半空间,所以能在较短时间内完成GC。

并且每次复制的时候,对象都会集中,避免碎片。

标记-清除算法和复制算法优缺点都非常明显。

1960年, George E. Collins独辟蹊径,提出了一个新的GC算法:引用计数

当时Collins可能没有注意到,引用计数法有个缺点,就是它不能回收“循环引用”

至此, 垃圾收集技术的三大算法已经集齐,GC根本性的内容已经完成。后人只是在GC大厦上修修补补罢了。

三位GC大佬说得没错,1970年出现的标记-压缩算法就是标记-清除和复制算法结合的产物。

标记压缩算法工作起来是这样的:

标记-压缩看起来和复制算法很像,但是算法实现要复杂得多

后来人们又发现:大部分对象的生存期限很短,生下来不久就变成垃圾

于是把对象进行分代,对不同的分代实施不同的垃圾收集算法

几十年过去了, 垃圾回收技术不断完善, 计算机的性能也越来越高。 

Lisp曾经遭遇的GC尴尬不会再出现了,GC逐渐成了编程语言的标配。 

当然, 还有些编程语言在坚守,因为他们承担着更重要的使命。

GC把程序员从内存管理中解放出来,世界上没有免费的午餐,付出的代价就是多了虚拟机/解释器这一层额外的开销。

也许有这么一天,程序员既不需要操心内存空间的管理,又可以充分发挥硬件的效率,期望这一天能够来临。 

嗯, 这一天其实已经来了,它就是Z语言, 参见《Z语言传奇

(完)

近期热文推荐

你“在看”我吗?

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

本文分享自 腾讯大讲堂 微信公众号,前往查看

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

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

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