go语言垃圾回收
概述
在c/c++当中,需要程序员自己管理内存;定义一个变量,就是在内存中开辟一段响应的空间来进行存储,而内存的容量是有限的,当不需要再使用这个变量的时候就需要销毁该对象并释放其所占的内存空间;在c/c++中释放内存需要程序员手动的进行释放。这样就显的非常的繁琐,如果有遗漏,就可能导致资源浪费甚至
内存泄露
为了解决这个问题,后来开发的语言(php,java)都引入了语言层面的自动内存管理,也就是说使用者只用关心内存的申请不用关注内存的释放,内存的释放由虚拟机(virtual machine)或运行时(runtime)在自动进行管理。这种对不在使用的资源进行自动的回收功能就成为垃圾回收。
垃圾回收的由来
程序跑起来是需要内存的,栈内存是由编译器来管理的,堆内存是由程序员来管理的。因此go语言的垃圾回收就是管理堆上的内存
垃圾回收的分类
引用计数法
- 引用计数法就是对象的引用+1,去掉引用就-1
- 优点:简单,回收速度快
- 缺点:需要额外的空间进行计数,无法解决循环引用的问题,频繁更新引用计数降低性能
标记删除法
- 就是对栈上引用堆的内存一个个栈进行扫描标记,标记出未使用变量,进行清扫
- 优点:解决了引用计数的循环引用的问题
- 缺点:需要stw(stop the word)暂停程序运行
go垃圾回收的版本与改进
标记清除法主要有两个重要步骤,标记和清扫。
go语言gc使用的三色标记法,是标记删除法的一种。
go语言gc主要几次重大的改进
- v1版本 采用的是标记删除法;
程序运行–> stw —> 标记和清扫 —> stw ->程序运行 - v1.3 版本 采用标记和删除法 清扫和程序并行
程序运行–> stw —> 标记 —> stw ->清扫、程序运行 - 1.5 版本 三色标记删除 + 插入写屏障
- 1.8版本 三色标记删除法+混合写屏障
go语言v1版本采用的是标记删除法,需要暂停程序进行gc,gc耗时300ms;在1.3版本进行了改进,暂停程序进行标记,清扫和程序运营并行;在1.5版本引入了三色标记删除法+插入写屏障的计数,使标记也可以程序运行同时并行,只需要开始在开始标记时候进行暂停程序和标记完成之后重新扫描栈暂停程序;在1.8版本在1.5版本的基础上使用了混合写屏障,将程序stw缩至更短。
还没有评论,来说两句吧...