代码改变世界

.net垃圾回收学习【Back to basics: Why use garbage collection】【翻译&&学习】

2011-08-28 10:04  一一九九  阅读(234)  评论(0编辑  收藏  举报

From:http://blogs.msdn.com/b/abhinaba/archive/2009/01/20/back-to-basics-why-use-garbage-collection.aspx

GC所做的事情就如同其名字“自动垃圾回收”一样。GC基本上主要负责两个基本的场景:移除垃圾、 避免悬挂指针。这两个是内部相关关联的的但是是不同的场景。

Garbage Collect

考虑一个典型的对象引用关系图(见下图)。 在对象图中,每个边都是一个Object,箭头指示对象的对象的引用。如图所示:A是一个引用B的Object,一个程序如果能够使用某个对象,那么这个对象需要在引用的链表中。引用链表通常从叫做Root的地方开始。Root一般是寄存器中的引用,Stack的局部变量和全局变量。

image_thumb

假定由于某种操作,A不在引用对象B,  对象引用图变成了下面的样子:

image_thumb_2

现在,在程序中,B和C 是从root获取不到的,也就成为了垃圾。 程序员必须确保找到所有的引用并释放掉这些对象。GC的一个职责就是通过跟踪这样的对象自动化这个过程并自动回收被这些对象使用的内存。到引用关系不存在后,GC能够推断出B和C是unReachable的,并且会释放掉这些对象。

Hanging/dangling reference

现在考虑另外一个对象关系图。这个关系图和上图类似,但是除了对象A引用对象B之外,另外一个对象A'也引用了对象B。如下图所示:

image_thumb_3

经历了一些操作之后,对象A不在引用对象B。 程序员认为此时应该释放掉对象B和C。

image_thumb_4

然而,A‘对象此时仍然引用这对象B,此时这个引用是悬挂的,或者用具体的术语来说指向了一个无效的内存区间,并且当再次获取的时候会导致不可预料的结果。关键点是不可预料的行为,这个操作并不会导致应用程序崩溃,除非对象B的内存空间被重新使用,并且仍然是有效的数据(比如说同一类型的不同实例),并且A’的引用仍然会起作用,程序的错误会出现在意向不到的不相关的地方,最终使得程序错误的跟踪变得非常困难。

GC帮助处理上述的这两种情况,并且确保系统不会导致其中的任一钟状况。

How important is GC

既然GC系统是如此的Cool为什么不是所有的系统都采用了GC,这里有很多的原因但是随着新的技术采用,大多数的原因都已经不存在了。其中的一个主要的原因是GC的效率问题,这也是GC在实时系统、驱动程序、游戏平台略微没有竞争力的一个主要原因。然而,有GC使用在这些系统的例子,比如说.net compat framework有完整的GC支持,被成功的应用在了XBox上的XNA程序上。

然后,我们的系统就像是依赖于许多的闭包和推断执行的功能语言,使得执行流程变得非常的不可预测,GC也就成为了系统采用的主要原因。