根(root)这个词的意思是“根基”“根底”。在GC 的世界里,根是指向对象的指针的“起点”部分。 这些都是能通过mutator 直接引用的空间。举个例子,请看下面的伪代码。 $obj = Object.new $obj.field1 = Object.new 在这里$obj 是全局变量。首先,我们在第1 行分配一个对象(对象A),然后把$obj 代入指向这个对象的指针。在第2 行我们也分配一个对象(对象B),然后把$obj.field1 代入指向这个对象的指针。在执行完第2 行后,全局变量空间及堆如图1.5 所示。 图1.5 全局变量空间及堆的示意图 在这里我们可以使用$obj 直接从伪代码中引用对象A,也就是说A 是活动对象。此外,因为可以通过$obj 经由对象A 引用对象B,所以对象B 也是活动对象。因此GC 必须保护这些对象。 GC 把上述这样可以直接或间接从全局变量空间中引用的对象视为活动对象。与全局变量空间相同,我们也可以通过mutator 直接引用调用栈(call stack)和寄存器。 也就是说,调用栈、寄存器以及全局变量空间都是根。 但在这里我们必须注意一点,那就是GC 在一般情况下无法严谨地判断寄存器和调用栈中的值是指针还是非指针。关于这一点会在第6 章详细说明。为了判断根中的指针,我们需要下点功夫。 在这里介绍怎么去判断未免太费口舌。所以在“算法篇”,我们先暂定“GC 可以严谨判断根中的指针和非指针”。这跟1.2 节的前提相同。 在“算法篇”中,根如图1.6 所示。 图1.6 根和堆里的对象 此外,我们将伪代码中有根的指针数组表示为$roots。也就是说,像下面这样编写,就能依次把所有由根引用的对象作为func() 函数的参数。 for(r : $roots) func(*r)
垃圾回收的算法与实现——1.8 根
书名: 垃圾回收的算法与实现
作者: 中村成洋 | 相川光
出版社: 人民邮电出版社
原作名: ガベージコレクションのアルゴリズムと実装
译者: 丁灵 | 相川光
页数: 456
定价: 99.00元
装帧: 平装
ISBN: 9787115427472