垃圾回收--标记清除算法

标记清除算法是GC的基础,包括标记和清除两个阶段。标记阶段从根开始递归标记所有可达对象,清除阶段回收未标记对象,形成空闲链表。此算法简单但存在碎片化问题,优化策略包括多空闲链表、位图标记和延迟清除等。

标记-清除算法

第一个GC算法

标记清除算法有两个阶段: 标记阶段和清除阶段 。标记是将活动对象做标志, 也就是识别非活动对象。清除就是非活动对象回收的过程

标记时候,会去标志所有的对象,因此,耗时与对象的总数是成正比的

因为会遍历所有对象,一般会用到两种搜索算法:

  1. 深度优先搜索
  2. 广度优先搜索

深度优先比广度优先搜索更能压低内存使用量, 二是可以将有关系的对象,放入到邻近的位置上

  1. 标记:

    通过根 递归地标记能访问到的对象, 这样根及其子对象都会被扫描到,并被标识

mark(obj){
 if(obj.mark == FALSE)
   obj.mark = TRUE
   for(child : children(obj))
      mark(*child)
}
  1. 清除

    在清除阶段中,collector 会遍历整个堆,回收没有打上标记的对象(即垃圾),使其能再
    次得到利用。并且一般会维护一个空闲链表,用于被回收空间的再次利用

    sweep_phase(){
     sweeping = $heap_start
     while(sweeping < $heap_end)
       if(sweeping.mark == TRUE)
         sweeping.mark = FALSE
       else
         sweeping.next = $free_list
         $free_list = sweeping
       sweeping += sweeping.size
    }
    #heap_start堆开始位置 heap_end 堆尾   free_list 空闲链表
    
  2. 分配空间

    当mutator 申请分块时, 搜索空闲链表并寻找大小合适的分块,清除阶段已经把垃圾对象连接到空闲链表.

  3. 合并

在 Go 语言中,按位清除运算符 `&^` 是一种特殊的按位运算符,用于将某个整数中的特定位设置为 0,而其他位保持不变。它结合了按位与(`&`)和按位非(`^`)操作的特性,可以高效地清除某些特定的标志位。 ### 按位清除运算符的工作原理 表达式 `a &^= b` 等价于 `a = a &^ b`,其含义是将 `a` 与 `b` 的按位非结果进行按位与运算。换句话说,对于 `b` 中为 1 的每一位,`a` 中对应的位将被设置为 0;而 `b` 中为 0 的位则保持 `a` 中的原始值不变。 ### 使用示例 下面是一个使用 `&^` 运算符的示例,演示如何清除一个整数中的某些特定位: ```go package main import "fmt" func main() { var a uint8 = 0b10101010 // 二进制表示 var b uint8 = 0b00001111 // 清除低四位 a &^= b // 清除 a 中与 b 中为 1 的对应位 fmt.Printf("结果为: %08b\n", a) // 输出结果为: 10100000 } ``` 在这个例子中,变量 `a` 的初始值为 `0b10101010`,而 `b` 的值为 `0b00001111`,表示我们希望清除 `a` 的低四位。执行 `a &^= b` 后,`a` 的低四位被设置为 0,最终结果为 `0b10100000`。 ### 与按位与和按位非的等价操作 上述操作等价于以下表达式: ```go a = a & (^b) ``` 其中,`^b` 表示对 `b` 进行按位取反操作,然后将结果与 `a` 进行按位与运算。这种方式可以达到相同的效果,但使用 `&^` 可以简化代码并提高可读性。 ### 应用场景 - **标志位管理**:在系统编程中,常常使用整数的某些位表示特定的状态或标志。通过 `&^` 可以安全地清除不需要的标志位,而不影响其他状态。 - **性能优化**:在某些对性能敏感的场景中,使用位运算可以减少内存访问和计算开销,`&^` 提供了一种高效的清除位的方式。 - **数据压缩**:在数据压缩算法中,经常需要对二进制位进行精细操作,`&^` 可以帮助快速调整位模式。 ### 总结 按位清除运算符 `&^` 是一种非常实用的工具,尤其适用于需要对整数的某些位进行清除操作的场景。它不仅简化了代码,还提高了可读性和执行效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值