go的垃圾回收算法

Python021

go的垃圾回收算法,第1张

从Gov1.12版本开始,Go使用了非分代的、并发的、基于三色标记清除的垃圾回收器。

关于垃圾回收,比较常见的算法有引用计数、标记清除和分代收集,Golang语言使用的垃圾回收算法是标记清除。

Golang语言的标记清除垃圾回收算法,为了防止GC扫描时内存变化引起的混乱。那么就需要 STW,即Stop The World。具体在Golang语言中是指,在GC时先停止所有goroutine。再进行垃圾回收,等待垃圾回收结束后再恢复所有被停止的goroutine。

标记清除方法

启动STW,暂停程序的业务逻辑,找出不可达对象和可达对象。

将所有可达对象做标记,清除未标记的对象。停止STW,程序继续执行。循环往复,直到进程程序生命周期结束。因为STW需要暂停程序,为了减少暂停程序的时间。将清除操作移出 STW执行周期,但是优化效果不明显。

所谓三色标记,实际上只是为了方便叙述而抽象出来的一种说法,三色对应垃圾回收过程中对象的三种状态。白色是对象未被标记,gcmarkBits对应位为0,该对象将会在本次GC中被清理。灰色是对象还在标记队列中等待被标记,黑色是对象已被标记,gcmarkBits对应位为0,该对象将会在本次 GC中被回收。

vertxgo的内存消耗要低于vert.x,因为它使用Go的优化机制,使其占用更少的内存。例如,它使用引用计数来确保变量的有效性,从而减少垃圾回收期间内存分配和释放等其他开销。此外,vertxgo还使用了GO语言的内存池,使得其内存使用率更低。由于Go语言的内存处理技术比其他语言更有效率,所以vertxgo的内存消耗会更低。

Go语言由Google公司开发,并于2009年开源,相比Java/Python/C等语言,Go尤其擅长并发编程,性能堪比C语言,开发效率肩比Python,被誉为“21世纪的C语言”。

Go语言在云计算、大数据、微服务、高并发领域应用应用非常广泛。BAT大厂正在把Go作为新项目开发的首选语言。

Go语言能干什么?

1、服务端开发:以前你使用C或者C++做的那些事情,用Go来做很合适,例如日志处理、文件系统、监控系统等

2、DevOps:运维生态中的Docker、K8s、prometheus、grafana、open-falcon等都是使用Go语言开发

3、网络编程:大量优秀的Web框架如Echo、Gin、Iris、beego等,而且Go内置的 net/http包十分的优秀

4、Paas云平台领域:Kubernetes和Docker Swarm等

5、分布式存储领域:etcd、Groupcache、TiDB、Cockroachdb、Influxdb等

6、区块链领域:区块链里面有两个明星项目以太坊和fabric都使用Go语言

7、容器虚拟化:大名鼎鼎的Docker就是使用Go语言实现的

8、爬虫及大数据:Go语言天生支持并发,所以十分适合编写分布式爬虫及大数据处理。