有没可能有一个人类简史,是这个世界的bug。如果有会被抓去研究吗

今天跟大家分享一下《垃圾回收嘚算法与实现》本书一出版即进入IT图书销量榜前列,由此可见大家对探秘GC的渴望
再不学GC就老了,快来看看为什么GC让程序员心动!

GC 是 Garbage Collection 的简称中文称为“垃圾回收”。在现实世界中“垃圾”指的是那些不读的书、不穿的衣服等不用的东西。在 GC 中“垃圾”的定义吔是如此,GC 把程序不用的内存空间视为垃圾

  1. 找到内存空间里的垃圾;
  2. 回收垃圾,让程序员能再次利用这部分空间

满足这两项功能的程序就是 GC。那么GC 到底会给程序员带来怎样的好处呢

在没有 GC 的世界里,程序员必须自己手动进行内存管理必须清楚地确保必要嘚内存空间,释放不要的内存空间

程序员在手动进行内存管理时,申请内存尚不存在什么问题但在释放不要的内存空间时,就必须一個不漏地释放这非常地麻烦。如果忘记释放内存空间该内存空间就会发生内存泄露 ,即无法被使用但它又会持续存在下去。如果将發生内存泄露的程序放着不管总有一刻内存会被占满,甚至还可能导致系统崩溃

另外,在释放内存空间时如果忘记初始化指向释放對象的内存空间的指针,这个指针就会一直指向释放完毕的内存空间因为这个指针没有指向有效的内存空间,处于一种悬挂的状态所鉯我们称其为“悬垂指针”(dangling pointer)。如果在程序中错误地引用了悬垂指针就会产生无法预期的 BUG。此外悬垂指针也会导致严重的安全漏洞(2009 年 IE6/7 的零日漏洞曾轰动一时。——丁灵注)

更有甚者还可能会出现错误释放了使用中的内存空间的情况。一旦错误释放了使用中的内存涳间下一次程序使用此空间时就会发生故障。大多数情况下会发生段错误运气不好的话还可能引发恶性 BUG。

上述这样与内存相关的 BUG其囲通之处在于“难以确定 BUG 的原因”。我们都知道与内存相关的 BUG 的潜在场所和 BUG 出现的场所在位置上(或者是时间上)不一致,所以很难确萣 BUG 的原因

为了省去上述手动内存管理的麻烦,人们钻研开发出了 GC如果把内存管理交给计算机,程序员就不用去想着释放内存叻在手动内存管理中,程序员要判断哪些是不用的内存空间(垃圾)留意内存空间的寿命。但只要有 GC 在这一切都可以交给 GC 来做。

有叻 GC程序员就不用再去担心因为忘了释放内存等而导致 BUG,从而大大减轻了负担也不用再去头疼费事的内存管理。GC 能让程序员告别恼人的內存管理把精力集中在更本质的编程工作上。

GC 是一门古老的技术

据笔者所知GC 因为 Java 的发布而一举成名,所以很多人可能会认为 GC 是朂近才有的技术不过 GC 有着非常久远的历史,最初的 GC 算法是 John McCarthy 在 1960 年发布的

John McCarthy 身为 Lisp 之父和人工智能之父,是一名非常有名的黑客事实上他同時也是 GC 之父。1960 年McCarthy 在其论文中首次发布了 GC 算法。当然当时还没有 Garbage Collection 这个词。在这篇论文中发布的算法就是现在我们所说的 GC 标记 - 清除算法。

1960 年George E. Collins 在论文中发布了称为引用计数的 GC 算法。当时 Collins 可能没有注意到引用计数法有个缺点,就是它不能回收“循环引用”Harold McBeth在 1963 年指出了这個缺点。

1963 年也有“人工智能之父”之称的 Marvin L. Minsky 在论文中发布了复制算法。GC 复制算法把内存分成了两部分这篇论文中将第二部分称为磁带存儲空间——不得不说带有浓烈的时代色彩。

50 年来GC 的根本都没有改变

从 50 年前 GC 算法首次发布以来,众多研究者对其进行了各种各样的研究洇此许多 GC 算法也得以发布。但事实上这些算法只不过是把前文中提到的三种算法进行组合或应用。也可以这么说1963 年 GC 复制算法诞生时,GC 嘚根本性内容就已经完成了

现在为世人所知的 GC 算法,不过是从之前介绍的三种基本算法中衍生出来的产物

本书中除了细致介绍这些基夲的 GC 算法,还会介绍应用到它们的 GC 算法把这些算法全看完后,请跟笔者一起就 GC 的课题进行思考。也许发现全新的第四种基本算法的人就是你。

为什么我们现在要学 GC

1、GC—— 存在即合理

现在我们使用的多数编程语言都搭载有 GC以下是几个具体的例子。

夶家有没有用过其中的某种编程语言如果用过,那你在不知不觉中获得了 GC 带来的好处

对编程语言来说,GC 就是一个无名英雄默默地做著贡献。打个比方天鹅在水面优雅地游动时,实际上脚蹼却在水下拼命地划水GC 也是如此。在由编程语言构造的美丽的源代码这片水下GC 在拼命地将垃圾回收再利用。

如上所述GC 是语言处理程序中非常重要的一部分,相当于树荫应该有很多人感觉“GC 帮忙回收垃圾是理所當然”的吧?

GC 基本上是高负载处理需要花费一定的时间。打个比方当编写像动作游戏这样追求即时性的程序时,就必须尽量压低 GC 导致嘚最大暂停时间如果因为 GC 导致玩家频繁卡顿,相信谁都会想摔手柄碰到这种应用,我们就需要选择最大暂停时间较短的 GC 算法了

再打個比方,对音乐和动画这样类似于编码应用的程序来说GC 的最大暂停时间就不那么重要了。更为重要的是我们必须选择一个整体处理时間更短的算法。

笔者深信事先知道“这个 GC 算法有这样的特征,所以它适合这个应用”对程序员来说很有价值

2、多种多样的处理程序的實现

近年来,随着编程语言的发展燃起了一股发布语言处理程序的势头,这些语言处理程序都搭载有不同的 GC 算法作为语言处理程序的關键功能,很多人将采用了优秀的 GC 算法作为一大卖点

GC 性能在语言处理程序的性能评价中也是一大要素。为了正确评价 GC 的性能对 GC 算法的悝解是不可或缺的。

3、留意内存空间的用法

应该有不少人是通过使用搭载 GC 的编程语言来学习编程的吧本书的作者之一中村也是如此,他朂初接触的编程语言是 Java可以说在用 Java 语言编写程序时完全不用留意内存空间的用法。当然这也是多亏了 GC这是好事,但太不留心也会招致麻烦例如,有时会出现无意中把内存空间挥霍一空的情况比如在循环中生成一些没用的对象等。这是因为没有把握好编程语言背后的內存管理的概念

本书中以具体的编程语言为例,来说明编程语言中所使用的内存空间的结构以及 GC 的运行。通过阅读我们就能在编程Φ留意内存空间的用法了。

GC 自 1960 年发布以来一直在吸引着顶尖工程师的目光。笔者确信只要计算机构造不发生根本性的改变,GC 就是一门鈈会过时的技术对程序员来说,比起学习日新月异的新技术学习 GC 这样的古典技术不是更幸福吗?

5、更何况GC 很有趣

说实话,其实笔者洎己学习 GC 的时候并没有想过上述这些略复杂的事情,只是纯粹觉得有趣现在回过头觉得学了 GC 真好,也只是因为它具备前面那些优点

筆者小时候就喜欢拆点什么东西,看看里面是怎样的电视机、收音机、红白机什么的都拆了个遍。笔者至今都还记得看到其内部时的快感以及了解其构造时的感动。或许学习 GC 也差不多是这样对笔者来说,研究 GC 这种理所当然存在的东西看看它的内部是一件非常刺激的倳。

在“算法篇”中我们没有必要去详细了解特定的编程语言,你只要能用任何一种语言编程就能往下读“算法篇”。

阅读“实现篇”需要具备 C 和 C++ 的知识只要会用 C 的函数指针、C++ 的模板,阅读“实现篇”就没有什么障碍关于 GC 算法的知识,读完本书的“算法篇”就相当夠用了

“实现篇”中涉及各种编程语言{ Python / Java / Ruby / JavaScript },最好有一定程度的了解那样阅读起来会比较轻松。

ガベージコレクションのアルゴリズムと実装
作者:中村成洋 相川光
定价:99(各大网店可购买)
电子书:49.99(点击目录购买电子书)

Ruby之父松本行弘推荐日本忝才程序员兼LISP黑客竹内郁雄审校
254幅图解,轻松掌握GC经典算法
实际源码剖析深入探讨GC具体实现

本书分为“算法篇”和“实现篇”两大部分。算法篇介绍了标记–清除算法、引用计数法、复制算法、标记–压缩算法、保守式GC、分代垃圾回收、增量式垃圾回收、RC Immix算法等几种重要嘚算法;实现篇介绍了垃圾回收在Python、DalvikVM、Rubinius、V8等几种语言处理程序中的具体实现本书适合各领域程序员阅读。

}

  闭关一年后善友教兽的首次演讲《非连续创新》给了混沌创业营开学,内容已经100%完全迭代缜密的推导和详实的资料,让听课越来越不轻松

他说,让听者接受道理佷简单讲故事+塑造情感。这些他擅长但是不喜欢。他希望以理服人挖掘现象底层的认知。对错不能保证能保证的是,会是你以前茬任何教材都看不到的内容希望能启发你从不同角度思考。

本文经混沌研习社(微信公众号:dfscx2014)授权转载研习社是一所线上商学院,致力為创业公司培养具有互联网思维和全球化视野的创新人才

  演讲者|李善友教授(混沌大学创办人)

过去一年,我在斯坦福大学闭关学习茬这么快的商业时代,能够放下一切到斯坦福待上一年,是一件很奢侈的事情也是我人生中最美好的时光。目前为止在我心中,斯坦福是全世界最好的学校以后可能是混沌大学。

我进斯坦福很重要的原因是寻找关于创新的基础理论。创业营根本不是讲创业而是講创新。但是关于创新怎么来教育?到目前为止还没有一套体系、一个理论。我希望到斯坦福寻找关于创新的根

今天的内容非常多,共汾为四个部分:非连续性、底层认知、第一性原理和创新实践我们先来看非连续性。

人类简史知识99%来自归纳法

  归纳法的前提是连续性

  但连续性只是一个错误假设

我跟大家推荐过《世界观》(繁体版)这本书 书里有一章讲归纳法。

什么叫归纳法?比如你看到亚洲的天鵝都是白色,就认为全世界的天鹅都是白色或者,过去太阳总是从东方升起所以将来太阳会继续从东方升起。

几千年以来我们所有知识都建立在这个归纳法上。但是英国哲学家休谟第一个发现了归纳法的致命bug:即使所有前提都正确,结论依然有可能错误归纳法隐含假设“未来将继续和过去一样”,换句话说应该叫连续性假设

问题是,你凭什么相信未来会继续跟过去一样呢?唯一的原因是:今天跟葃天一样昨天跟前天一样??所以未来总是跟过去一样的,并且会继续跟过去一样

但是,这只是一个隐含假设而已逻辑上无法证明。所以连续性不是一个客观事实而是人类简史思维和生存不得不依赖的一个假设条件而已。一旦连续性假设是错误的归纳法将会失效,人类简史一切知识将失去根基

这时候我们问一个问题:

这是一个粗看起来非常无聊的哲学话题,我们看一下结果在场38%的人选连续性,62%的人选非连续性的很好,很多人没有受我蛊惑

 过去一年,我最大的收获就是“非连续性”这四个字

可能你会纳闷说,李教兽峩们毕竟是创业营,不是哲学班归纳法、连续性跟创业有一毛钱关系吗?

要知道,管理思维也是建立在连续性基础之上的它的推理方式昰归纳法,所以归纳法的坑,同样也是管理思维的坑

  取决于产业周期是否连续

  自信预知未来比无知更危险

那么,提个问题:基于归纳法的成功经验是否可靠?

关于这一点罗素有一个非常著名的比喻,农场里面有一只鸡每一次看到农场主来会被喂食,这只鸡就認为农场主的到来和喂食存在着因果关系结果有一天,农场主带来的不是鸡食而是猎枪

我们几乎在所有的时候都是这只鸡。

哈佛商业評论有一篇文章《经验害死人》作者研究发现,即使经验丰富的专家也不能精准预见经济和技术发展走向。文中有句很讽刺的话:“洎信能预知未来甚至比无知更危险。”

你如果认为自己无知面对新情况时还能警觉;你如果自信能预测未来,即使事情变化了你也会看不到的。

当产业发展缓慢的时候产业周期是连续性的,归纳法是最有效的可以根据经验来指引未来。

  但是当市场遭遇不连续性,由于产业本身的S曲线变化在一个新的S曲线里面,两条曲线的性质和趋势根本不一样这时,过去的数据不但没用反而有害。

1984年的IBM税后净利润已达) 品牌合作与广告投放请联系:2 或

}

我要回帖

更多关于 人类简史 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信