欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

垃圾回收的算法与实现学习笔记五、GC标记-清除算法

程序员文章站 2022-05-06 16:51:30
...

一、分配

1、分配:是指将回收的垃圾进行再利用,清除阶段将垃圾对象连接到空链表。

2、搜索空闲链表并寻找大小合适的分块 => 分配。

new_obj(size) {
    chunk = pickup_chunk(size, $free_list); // 寻找分块 找到大小相同的直接分配 大的分割 分配
    if (chunk != NULL)
        return chunk;
    else
        allocation_fail();
}

3、First-fit、Best-fit、Worst-fit区别。

1)First-fit:最初发现大小等于size的分块时就会立即返回该分块。

2)Best-fit:遍历空链表,返回大小等于size的最小分块。

3)Worse-fit:找出空闲链表中最大的分块,将其分割成mutator申请的大小和分割后剩余的大小=> 目的:将分割后剩余的分块最大化。缺点很容易产生大量小的分块。

4、使用单纯的空链表时,考虑分配所需的时间,选择First-fit更为明智。

二、合并

1、合并:根据分配策略的不同处理后可能会产生大量的小分块。如果他们是连续的,就可以将它们连接起来形成大分块。

2、“连接连续分块” => 合并(coalescing),合并在清除阶段进行。

sweep_phase() {
    sweep = $heap_start;
    while (sweeping < $heap_end)
        if (sweeping.mark == TRUE)
            sweeping.mark = FALSE;
        else
            if (sweeping == &free_list + &free_list.size) //发现
                $free_list.size += sweeping.size; // 合并
            else
                sweeping.next = &free_list;
                $free_list = sweeping;
            sweeping += sweeping.size;
}

 

相关标签: GC