GC_0_定义


0


0 GC

0.1 GC的定义

  GC,Garbage Collection,垃圾回收。

0.1.1 垃圾的回收

  在现实世界中,垃圾指的是那些不读的书、不穿的衣服等,自己不用的东西。
  在GC中,GC把程序不用的内存空间视为垃圾。

0.1.2 GC要做两件事

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

  满足这两项功能的程序就是GC。

0.2 GC的好处

0.2.1 没有GC的世界

  在没有GC的世界里,程序员必须自己手动进行内存管理,必须清楚地确保必要的内存空间,释放不要的内存空间。
  程序员在手动进行内存管理时,申请内存尚不存在什么问题,但在释放不要的内存空间时,就必须一个不漏地释放,这非常的麻烦。
  如果忘记释放内存空间,该内存空间就会发生内存泄漏(内存泄漏就是内存越用越少,最终导致程序没有可用的内存空间),即无法使用,但它又会存在下去。如果将发生内存泄漏的程序放着不管,总有一刻内存会被沾满,甚至还可能导致系统崩溃。
  另外,在释放内存空间时,如果忘记初始化指向释放对象的内存空间的指针,这个指针就会一直指向释放完毕的内存空间,因为这个指针没有指向有效的内存空间,处于一种悬挂的状态,所以称为悬垂指针(dangling pointer)。如果程序中错误地引用了悬垂指针,就会产生无法预期的BUG。此外,悬垂指针也会导致严重的安全漏洞。
  更有甚者,还可能会出现错误释放了使用中的内存空间的情况。一旦错误释放了使用中的内存空间,下一次程序使用此空间时机会发生故障,大多数情况下会发生段错误,运气不好,还会引发恶性BUG。
  上述这样与内存相关的BUG,其共通之处在于难以确定BUG的原因,与内存相关的BUG的潜在场所和BUG出现的场所在位置或者时间上不一致,所以很难确定BUG的原因。

0.2.2 有GC的世界

  为了省去上述手动内存管理的麻烦,人们钻研开发了GC。如果把内存管理交给计算机,程序员就不用去想着释放内存了。
  在手动内存管理中,程序员要判断哪些是不用的内存空间,留意内存空间的寿命。但只要有GC在,这一切都可以交给GC来做。
  有了GC程序员就不用再去担心因为忘了释放内存等导致的BUG,从而大大减轻了负担。也不用再去头疼费事的内存管理。GC能让程序员告别恼人的内存管理,把精力集中在更本质的编程工作中。

0.3 GC的历史

0.3.1 GC是一门古老的艺术

  GC因为Java的发布而一举成名,很多人认为GC是最近才有的技术。不过GC有着非常久远的历史,最初的GC算法是John McCarthy在1960年发布的。

0.3.2 GC标记-清除算法

  John McCarthy,Lisp之父,人工智能之父,GC之父。
  1960年,McCarthy在其论文中首次发布了GC算法。

0.3.3 引用计数法

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

0.3.4 GC复制算法

  1963年,Marvin L.Minsky在论文中发布了复制算法。
  GC复制算法把内存分成了两部分,论文中将第二部分称为磁带存储空间。

0.3.5 GC的根本都没有改变

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

0.4 为什么我们现在要学GC

0.4.1 GC-存在即合理

  现在大多数编程语言都搭载有GC。对编程语言来说,GC就是一个无名英雄,默默地做着贡献。就好比,天鹅在水面优雅地游动时,实际上脚蹼却在水下拼命的划水。GC也是如此,在编程语言构造的美丽的源代码这片水下,GC在拼命地将垃圾回收再利用。
  GC基本上是高负载处理,需要花费一定的时间。
  当编写像动作游戏这样追求即时性的程序时,就必须尽量压低GC导致的最大暂停时间。如果因为GC导致玩家频繁卡顿,谁都会想摔手柄。碰到这种应用,我们就需要选择最大暂停时间较短的GC算法了。
  对音乐和动画这样类似于编码应用的程序来说,GC的最大暂停时间就不那么重要了。更为重要的是,我们必须选择一个整体处理时间更短的算法。

  “这个GC算法有这样的特征,所以它适合这个应用“,对我们来说很有价值。

  如果我们不理所当然地去利用GC,而是去了解其内部情况,自己来评价GC算法,那么自身的编程水平就会得到一定的提升。

0.4.2 多种多样的处理程序的实现

  随着编程语言的发展,燃起了一股发布语言处理程序的势头,这些语言处理程序都搭载有不同的GC算法。作为语言处理程序的关键功能,很多人将采用了优秀的GC算法作为一大卖点。
  GC性能在语言处理程序的性能评价中也是一大要素,为了正确评价GC的性能,对GC算法的理解是不可或缺的。

0.4.3 留意内存空间的用法

  Java语言在编写程序时完全不用留意内存空间的用法,当然是多亏了GC,这是好事儿,但是太不留心也会招致麻烦。
  有时会出现无意中把内存空间挥霍一空的情况。如在循环中生成一些没用的对象等。这是因为没有把握好编程语言背后的内存管理的概念。

0.4.4 不会过时的技术

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

参考文献:《垃圾回收的算法与实现》,中村成洋、相川光

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值