系统程序中最常遇到的样板管理(bookkeeping)的地方之一是管理分配对象的生存期。在诸如C语言中,它需要手动完成的,这会消耗程序员大量的时间,并且经常是发生错误。 即使在提供帮助机制的C ++或Rust这样的语言中,这些机制也会对软件的设计产生重大影响,通常会增加其自身的编程开销。 我们认为消除这样的程序员的开销是至关重要的,而过去几年垃圾收集技术的进步让我们有信心可以足够便利地实现垃圾收集,而且延迟也足够低,可以成为网络系统的可行方法。
并发编程的大部分困难都源于对象寿命问题:当对象在线程之间传递时,保证它们安全地被释放就变得很麻烦。自动垃圾收集使并发代码的编写变得更加容易。当然,在并发环境中实现垃圾收集本身就是一个挑战。
最后,抛开并发性不谈,垃圾收集使接口变得更简单,因为它们不需要指定如何跨接口管理内存。
这并不是说最近在Rust等语言中的工作为管理资源的问题带来了新的想法是错误的;我们鼓励这项工作,并很高兴看到它的发展。但是Go采用了一种更传统的方法,通过垃圾收集,而且仅仅是垃圾收集来解决对象寿命问题。
GO当前的实现是标记清除收集器。 如果机器是多处理器,则收集器与主程序并行运行在单独的CPU内核上。 最近几年在收集器上的主要工作已经将暂停时间减少到了亚毫秒的范围,即使是大堆,也是如此,所有这些都消除了网络服务器中对垃圾收集的主要问题之一。我们还在继续努力完善算法,进一步减少开销和等待时间,并探索新方法。 Go团队的Rick Hudson在2018 ISMM主题演讲中描述了迄今为止的进展并提出了一些未来的方法。
关于性能的话题,请记住,Go给了程序员相当大的内存布局和分配控制权,远远超过了垃圾收集语言中的典型控制权。精心设计的程序员可以很好地使用该语言,从而大大减少垃圾回收的开销。 有关工作示例,请参阅有关对Go程序进行概要分析的文章,其中包括Go的概要分析工具的演示。
Golang 外文翻译golang.org/doc/faq#sta…