Skip to content

Latest commit

 

History

History
13 lines (7 loc) · 2.27 KB

为什么要进行垃圾收集代价是否太大.md

File metadata and controls

13 lines (7 loc) · 2.27 KB

为什么要进行垃圾收集代价是否太大

系统程序中bookkeeping的最大来源之一是管理分配对象的生命周期。在诸如 C 这类,通过程序员手动管理对象的生命周期的语言,无疑会消耗大量程序员时间,并且时常会产生错误。即使在 C++ 或 Rust 等提供辅助机制的语言中,这些机制也会对软件的设计产生重大影响,通常会增加其自身的编程开销。我们认为消除此类程序员开销至关重要,过去几年垃圾收集技术的进步让我们相信它可以足够高效地实现,并且延迟足够低,它可以成为网络系统的可行方法。

并发编程的许多困难源于对象生命周期问题:当对象在线程之间传递时,保证它们被安全释放变得很麻烦。自动垃圾收集使并发代码更容易编写。当然,在并发环境中实现垃圾收集本身就是一个挑战,但是一次性解决这个问题总比在每个程序中都要处理得好。

最后,撇开并发不谈,垃圾收集使接口更简单,因为它们不需要指定如何跨接口管理内存。

这并不是说最近在 Rust 等语言中为资源管理问题带来新想法的工作被误导了;我们鼓励这项工作,并很高兴看到它是如何发展的。但是 Go 采取了一种更传统的方法,通过垃圾收集来解决对象的生命周期,并且单独使用垃圾收集。

当前的实现是一个标记和清除收集器。如果机器是多处理器,则收集器与主程序并行运行在单独的 CPU 内核上。近年来在收集器上的主要工作已将暂停时间减少到亚毫秒范围,即使对于大堆heap也是如此,几乎消除了对网络服务器中垃圾收集的主要反对意见之一。继续改进算法,进一步减少开销和延迟,并探索新方法。 Go 团队的 Rick Hudson 在 2018 年 ISMM 主题演讲中描述了迄今为止的进展并提出了一些未来的方法。

在性能方面,请记住 Go 为程序员提供了对内存布局和分配的相当大的控制,这比垃圾收集语言中的典型控制要多得多。一个细心的程序员可以通过很好地使用该语言来显着减少垃圾收集的开销;请参阅关于分析 Go 程序的文章以获取工作示例,包括 Go 分析工具的演示。