楔子
专研.Net CLR 核心技术,本篇 GC垃圾回收的计划阶段,二叉树的构建。
背景
垃圾回收需要经过,计划阶段进行后续操作,此处来看下计划阶段里面的重要步骤二叉树构建。.
1.逻辑
二叉树的构建逻辑是基于奇偶数以及非2的次方数(2的几次方)来构建的。
举个例子,比如:0,1,2,3,4,5,6,7,8,9
这里面的分为三类:
二类,计算公式:!(integer & (integer-1))
符合条件的有:0,1,2,4,8
二类, 计算公式:(integer & 1) != 0
3,5,7,9
三类,不符合上面两个公式的
只有6
2.小堆段
当一个.Net对象实例化之后,会放在托管堆里面。因为托管堆里面又涉及到托管对于非托管的调用。所以会有固定对象的标记。
CLR引擎利用固定和非固定对象形成的一个个小堆段,从低地址断到高地址段进行小堆段序号排序,作为二叉树节点的序号。分别为0,1,2,3,4..............依次排序。
那么排序的序号就成为了上面的二叉树的逻辑构建。
3.二叉树构建
参照上面的逻辑构建段
一:当二叉树的节点序号为0,1,2,3的时候,如下图:
2的次方数作为根节点,而除此之外的奇数和偶数(注意这个偶数也要把2的次方数除外,比如上面逻辑第三类只有一个6)
二:当4,5,6序号节点加进来的时候
这里4,5,6为什么长这样?首先4作为2的2次方,成为了新的根节点,而6作为逻辑中的第三类,它计算了当前二叉树的深度,然后挂接在深度的地方,取代了原来根节点4的右子节点5,把5变成了它自己(6)的左子节点。而自己(6)又作为4的右子节点进行一个挂接。
三:继续看,7,8,9,10
这里的8作为2的三次方,又成为了新的根节点,,而7作为一个奇数,则成为了刚刚计算深度节点6的右子节点。节点10和6是同样的情况,取代了根节点8的右子节点9。
结尾
二叉树的构建是GC 计划阶段的重要一步,此后所有的逻辑操作都找落在这颗树上了。