2)标记过程
标记过程采用的算法为DFS三色标记算法。
这里大致介绍一下三色标记法:如果节点当中有3个颜色,白色,灰色和黑色,白色代表这个节点从来没有被处理过,灰色代表正在被处理,黑色代表已经被处理。对应标记就是白色代表这个节点还没被标记,灰色代表正在被标记还没标记完,黑色代表已经标记完而且确确实实不能被回收。
下面举个例子:
图代表对象之间的引用关系,假设把1当做根对象,首先把1标记成灰色。
1引用的对象是4,下一步就是把4标记成灰色。
现在有一个问题,4和1,2,5相连,那怎么选择呢?到底选择1,2,还是5呢?很简单,1已经被标记,所以不会选择,而4会在2和5之间随便选一个,2也可以,5也可以。那么现在假设4选择了2,把2标记成灰色。
2和4,5相关联,但4已经被标记,所以只能选择5。
同理5会选择3。
此时3没有与任何节点相连,所以下一步会把3标记成黑色代表3已经处理完成。
而后退出到5,此时可以发现5和3,2,4有关联,代表可以通过5来标记3,也可以通过5来标记2或者4。但现在5和3这条线路已经被处理,5和2正在被处理(红线代表正在被处理),但5和4还有一个标记,此时5会发现4也正在被处理,所以会退回来把,此时才会把5标记成黑色。
下一步就是处理2。
2和5、4相连,5已经被粗粒,他只能处理4,在处理4之前会把2标记成黑色,2在标记4,4可以和2,5,1关联,2和5已经被处理,此时4会去探测一下,然后把4和5这条路径给断掉,然后把4标记成黑色。
最后在把1标记成黑色。
通过这种三色标记法,就可以通过根对象把与根对象相关联的对象都找到处理。
(3)Shallow &&Retained Size
在内存中申请一个结构体,通过SizeOf算出来的大小就是Shallow Size。
但是如果这个结构体有个指针,指向别的结构体,那么通过这个结构体可以关联到其他对象,这些对象可以是很大的,那么这些结构体大小加起来的大小就是Retained Size。Retained Size代表垃圾回收器实际回收的大小。
如上图,R01的Retained Size就是S01+S02+S03,因为04被根引用,所以不输入01,依次类推,R02=S02+S03,R03=S03,R04=S04。
在看这幅图,因为04没有被根引用到,所以R01=S01+S02+S03+S04,R02=S02+S03+S04,R03=S03,R04=S04。
(4)实现