32111.6 标记阶段 对象 A 对象 B 对象 C 对象 B 对象 C 对象 A 对象 B 对象 C scanObject(对象 A) scanObject(对象 B) finger 比 finger 所指向的地址位置低的所有地址 堆 标记 标记 标记栈 标记栈 finger 图11.29 对堆积到标记栈里的对象进行标记 这里大家要问了:“为什么不使用递归标记呢?” 对象之间形成了树形结构,我们采用递归标记操作不是更简单吗? 答案是这会造成“栈溢出”。 在每次调用 C 语言的函数时,帧都会被堆积到调用栈中。不过如果对象有着非常复杂的 树形结构,那么通过函数的递归,就会有惊人数量的帧被堆积到调用栈中。 我们并不能无限地往调用栈里堆积帧,一旦超过上限,就会发生栈溢出,引发错误。 在 DalvikVM 中,为了避免出现这个栈溢出的问题,在标记操作中不使用递归,而是尽 量不去扩充栈。 此外,至于不使用递归标记的另一个原因,请参看 4.3.3 节。
评论星级较低,若资源使用遇到问题可联系上传者,3个工作日内问题未解决可申请退款~