在线旅游网站建设方案,怎么在网上卖东西啊,dux大前端WordPress,网站 毕业设计代做文章目录一、标记清除#xff08;三色标记#xff09;大致原理1、标记细节2、root对象二、垃圾回收触发机制垃圾回收#xff08;Garbage Collection#xff09;#xff0c;是一种自动管理内存的机制。传统编程语言#xff08;如C/C#xff09;需要开发者对无用内存资源进…
文章目录一、标记清除三色标记大致原理1、标记细节2、root对象二、垃圾回收触发机制垃圾回收Garbage Collection是一种自动管理内存的机制。传统编程语言如C/C需要开发者对无用内存资源进行手动释放。而 Go 则是通过 runtime 实现对内存资源的管理自动释放无用内存资源。 一、标记清除三色标记大致原理
三色标记法将对象分为三类
白色对象可能死亡未被回收器访问到的对象。在回收开始阶段所有对象均为白色当回收结束后白色对象均不可达。灰色对象确定存活已被回收器访问到的对象此时已经能确认该对象是存活的。但回收器需要对其中的一个或多个指针进行扫描因为他们可能还指向其他白色对象。黑色对象确定其所有引用此对象的对象已被回收器访问到的对象其中所有字段都已被扫描黑色对象中任何一个指针都不可能直接指向白色对象。
GC工作流程其中有两次stop the world
1、标记细节
GC 开始时认为所有 object 都是 白色即垃圾。从 root 区开始遍历被触达的 object 置成 灰色。遍历所有灰色 object将他们内部的引用变量置成 灰色自身置成 黑色循环第 3 步直到没有灰色 object 了只剩下了黑白两种白色的都是垃圾。
对于黑色 object如果在标记期间发生了写操作写屏障会在真正赋值前将新对象标记为 灰色。 标记过程中mallocgc 新分配的 object会先被标记成 黑色 再返回。
2、root对象
root对象在垃圾回收的术语中又叫做root集合它是垃圾回收器在标记过程时最先检查的对象。
根对象包括
全局变量程序在编译期就能确定的那些存在于程序整个生命周期的变量。执行栈每个 goroutine 都包含自己的执行栈这些执行栈上包含栈上的变量及指向分配的堆内存区块的指针。寄存器寄存器的值可能表示一个指针参与计算的这些指针可能指向某些赋值器分配的堆内存区块。
二、垃圾回收触发机制
1、内存分配量达到阀值触发
每次内存分配时都会检查当前内存分配量是否已达到阀值如果达到阀值则立即启动 GC。阀值 上次 GC 内存分配量 * 内存增长率内存增长率由环境变量 GOGC 控制默认为 100即每当内存扩大一倍时启动 GC。
2、定期触发
默认情况下最长 2 分钟触发一次 GC这个间隔在 src/runtime/proc.go:forcegcperiod 变量中被声明
3、手动触发
程序代码中也可以使用 runtime.GC()来手动触发 GC。这主要用于 GC 性能测试和统计。