源码主要位于文件 src/runtime/mgc.go go version 1.16
触发条件从大方面说,可分为 手动触发 和 系统触发 两种方式。手动触发一般很少用,主要由开发者通过调用 runtime.GC() 函数来实现,而对于系统自动触发是 运行时 根据一些条件判断来进行的,这也正是本文要介绍的内容。
不管哪种触掘陵发方式,底层回收机制是一样的,所以我们先看一下手动触发,根据它来找系统触发的条件。
可以看到开始执行GC的是 gcStart() 函数,它有一个 gcTrigger 参数,是一个触发条件结构体,它的结构体也很简单。
其实在Golang 内部所有的GC都是通过 gcStart() 函数,然后指定一个 gcTrigger 的参数来开始的,而手动触发指定的条件值为 gcTriggerCycle 。 gcStart 是一个很复杂的函数,有兴趣的可以看一下源码实现。
对于 kind 的值有三种,分别为 gcTriggerHeap 、 gcTriggerTime 和 gcTriggerCycle 。
运行时会通过 gcTrigger.test() 函数来决定是否需要触发GC,只要满足上面基中一个即可。
到此我们基本明白了这三种触发GC的条件,那么对于系统自动触发这种,Golang 从一个程序的开始到运行,它又是如何一步一步监控到这个条件的呢?
其实 runtime 在程序启动时,会在一个初始化函数 init() 里启用一个 forcegchelper() 函数,这个函数位于 proc.go 文件。
为了减少系统资源占用,在 forcegchelper 函数里会通过 goparkunlock() 函数主动让自己陷入休眠,以后由 sysmon() 监控线程根据条件来恢复这个gc goroutine。
可以看到 sysmon() 会在一枝散敏个 for 语句里一直判断这个 gcTriggerTime 这个条件是否满足,如果满足的话,会将 forcegc.g 这个 goroutine 添加到全局队列里进行调度猛枝(这里 forcegc 是一个全局变量)。
调度器在调度循环 runtime.schedule 中还可以通过垃圾收集控制器的 runtime.gcControllerState.findRunnabledGCWorker 获取并执行用于后台标记的任务。
适合。框架足够成熟了 A Survey of 5 Go Web Frameworks小型项目你甚至不用框架,用net/http http - The Go Programming Language
常用库也成熟了 Top - Go Search
golang的web后端即使不concurrent也比php,ruby,python快很多很多
golang里用concurrent真的非常方便,非常非常快,超大web项目golang scale成本低
如果你想,golang的部署可以比php更方便,使用go get和http.ServeAndListen()可以不用nginx和apache
对于文件改动重新编译其实并不是大问题,看pilu/fresh · GitHub,其实你自己唯或写shell脚本(也可以直接用go写,因为指弊伍它本身就是系统语言)监控文件系统改动然后自动重新build,即使是C/C++的项目这也不是大问题,人们不用C/C++写web是因为它们不是写web app的最佳选择卜明
golang写的代码编译通过后,要比scripting language鲁棒,因为go compiler强制一些最佳实践
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语言天生支持并发,所以十分适合编写分布式爬虫及大数据处理。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)