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

msz*_*rlo 1 erlang elixir beam

好吧,标题说明了一切:我想知道 BEAM 不垃圾收集原子的原因是什么。我知道问题How Erlangatoms can be Garbage Collected ,但是,虽然相关,但它没有回答Why

Hau*_*eth 5

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

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

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