节中讲到的“确实活-togaf 9.2 full version
56 第3章 引用计数法 图3.9 初始状态 $hatch_queue 根 有循环引用的对象群是 ABC 和 DE,其中 A 和 D 由根引用。此外,这里由 C 和 E 引用 F。 所有对象的颜色都还是初始状态下的黑色。 3.7.3 dec_ref_cnt()函数 接下来,通过 mutator 删除由根到对象 A 的引用。这个引用是由 update_ptr() 函数产 生的。跟以往的引用计数法一样,为了将对象 A 的计数器减量,在 update_ptr() 函数中调 用 dec_ref_cnt() 函数。不过在部分标记 - 清除算法中,dec_ref_cnt() 函数和以往有少许 不同。 代码清单3.16:部分标记-清除算法中的dec_ref_cnt()函数 1 2 3 4 5 6 7 8 dec_ref_cnt(obj){ obj.ref_cnt-- if(obj.ref_cnt == 0) delete(obj) else if(obj.color != HATCH) obj.color = HATCH enqueue(obj, $hatch_queue) } 第 2 行到第 4 行的 dec_ref_cnt() 函数和以往引用计数法中的没什么不同。不过,如果 要删除的对象在队列中,那么这里使用的 delete() 函数也需要将该对象从队列中删除。 我们该注意的是第 5 行之后。算法在对 obj 的计数器进行减量操作后,检查 obj 的颜色。 当 obj 的颜色不是阴影的时候,算法会将其涂上阴影并追加到队列中。当 obj 的颜色是阴影 的时候,obj 已经被追加到队列中了,所以程序什么都不做。 dec_ref_cnt() 函数执行之后的堆状态如图 3.10 所示。 非常简单明了吧。在标记阶段中,collector 会为堆里的所有活动对象打上标记。为此, 我们首先要标记通过根直接引用的对象。这里的“对象”就是我们在 1.8 节中讲到的“确实 活动着的对象”。首先我们标记这样的对象,然后递归地标记通过指针数组能访问到的对象。 这样就能把所有活动对象都标记上了。 2.1 什么是GC标记 -清除算法 常简单明了吧。在标记阶段中,collector 会为堆里的所有活动对象打上标记。为此,我 们首先要标记通过根直接引用的对象。这里的“对象”就是我们在 1.8 节中讲到的“确实活动 着的对象”。首先我们标记这样的对象,然后递归地标记通过指针数组能访问到的对象。这 样就能把所有活动对象都标记上了。 2.1.1 标记阶段 非常简单明了吧。在标记阶段中,collector 会为堆里的所有活动对象打上标记。为此, 我们首先要标记通过根直接引用的对象。这里的“对象”就是我们在 1.8 节中讲到的“确实 活动着的对象”。首先我们标记这样的对象,然后递归地标记通过指针数组能访问到的对象。 这样就能把所有活动对象都标记上了。 2.1 什么是GC标记 -清除算法 2.1.1 标记阶段 非常简单明了吧。在标记阶段中,collector 会为堆里的所有活动对象打上标记。为此, 我们首先要标记通过根直接引用的对象。这里的“对象”就是我们在 1.8 节中讲到的“确实 活动着的对象”。首先我们标记这样的对象,然后递归地标记通过指针数组能访问到的对象。 这样就能把所有活动对象都标记上了。 2.6.1.1 与写时复制技术兼容 非常简单明了吧。在标记阶段中,collector 会为堆里的所有活动对象打上标记。为此, 我们首先要标记通过根直接引用的对象。这里的“对象”就是我们在 1.8 节中讲到的“确实活 动着的对象”。首先我们标记这样的对象活动着活活动对象都标记上了。
- 粉丝: 40
- 资源: 4102
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助