jvm三色标记

    xiaoxiao2021-03-25  73

    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)实现

    转载请注明原文地址: https://ju.6miu.com/read-32618.html

    最新回复(0)