您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    Go GC 怎样标记内存?颜色是什么含义?图解三色标记法(2)
    时间:2020-07-09 21:45 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    如今灰色的对象被参加到扫描队列并被标记为黑色:

    对参加到扫描队列的一切对象重复做相反的操作,直到没有对象需求被处置:

    处置完毕时,黑色对象表示内存中在运用的对象,白色对象是要被回收的对象。我们可以看到,由于 struct2 的实例是在一个匿名函数中创立的且不再存在于栈上,因此它是白色的且可以被回收。

    归功于每一个 span 中的名为 gcmarkBits 的 bitmap 属性,三色被原生地完成了,bitmap 对 scan 中相应的 bit 设为 1 来追踪 scan。

    我们可以看到,黑色和灰色表示的意义相反。处置的不同之处在于,标记为灰色时是把对象参加到扫描队列,而标记为黑色时,不再扫描。

    GC 最终 STW,肃清每一次写屏障对 work pool 做的改动,继续后续的标记。

    你可以在我的文章 Go GC 怎样监控你的运用[5] 中找到关于并发处置和 GC 的标记阶段更详细的描画。

    runtime 剖析器

    Go 提供的工具使我们可以对每一步停止可视化,察看 GC 在我们的顺序中的影响。开启 tracing 运转我们的代码,可以看到前面一切步骤的一个概览。下面是追踪结果:


    traces of the garbage collector

    标记 worker 的生命周期也可以在追踪结果中以协程等级可视化。下面是在启动之前先在后台等候标记内存的 Goroutine #33 的例子。

    Go GC 怎样标记内存?颜色是什么含义?图解三色标记法


    marking worker

    【编辑引荐】

    干货分享:用 Go 从头完成一个迷你 Docker—Gocker

    片面比较Rust与Go言语

    云原生的 Java与Golang

    Go 言语一次真实的错误吞并的经验

    开源 Go 项目引荐:将汉字转拼音,居然能带声调

    (责任编辑:admin)