Golang内存分配及垃圾回收

 Golang内存分配及垃圾回收_第1张图片

Golang内存分配及垃圾回收_第2张图片

为什么需要垃圾回收?

自动释放不需要的对象,让出存储器资源,无需程序员手动执行
Go V1.3之前是标记-清除算法

具体步骤

缺点:程序卡顿、扫描整个heap、数据清除会产生heap碎片

V1.3之后,做了简单的优化

Golang内存分配及垃圾回收_第3张图片

V1.5之后,使用三色并发标记法

只要是新创建的对象,默认颜色都是白色

触发条件:当一个白色对象被黑色对象引用(白色对象挂在黑色对象下面) 且 灰色对象与它之间可达关系的白色对象遭到了破坏。 

引入了屏障机制

强三色不变性:强制性不允许黑色对象引用白色对象

弱三色不变性:所有被黑色对象引用的白色对象都处于灰色保护状态

为了遵循上述的两种方式,有两种方式,插入屏障,删除屏障

插入屏障:在A对象引用B对象的时候,B对象被标记为灰色(讲B挂在A下游,B必须被标记为灰色),满足强三色不变式。 

黑色对象的内存槽有两种位置,栈和堆,栈的特点是空间容量比较小,要求相应的速度快,因为函数调用弹出频繁,所以“插入屏障”机制在栈空间的操作对象中不使用,而仅仅在堆空间对象的操作中。

删除屏障,具体操作:被删除的对象,如果自身为灰色或者白色,那么被标记为灰色。满足:弱三色不变性(保护灰色对象到白色对象的路径不会断)

你可能感兴趣的:(golang,开发语言,golang)