为什么原子不被 BEAM 垃圾收集?

Why are atoms not garbage collected by the BEAM?

好吧,标题说明了一切:我想知道 BEAM 不对原子进行垃圾收集的原因是什么。我知道问题 How Erlang atoms can be garbage collected 但是,虽然相关,但它没有回复 why.

因为在当前的设计中这是不可能的(或者至少很难)。原子是以下的重要组成部分:

  • 模块,因为模块名称是原子
  • 函数名,也是原子
  • 分布式 Erlang 也广泛使用原子

尤其是最后一点很难。想象一下,我们将有一个原子 GC。如果在我们通过线路发送一些原子的分布式调用之间进行 GC 清理,会发生什么情况?所有这些使得原子对于 VM 的工作方式非常重要,并且使它们被 GC 处理不仅会使 VM 的实现变得更加复杂,而且还会使代码变慢得多,因为原子不需要在进程之间复制,而且这些原子不会被 GC 处理,这些在GC标记步骤中完全可以省略。