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

问题描述

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

解决方法

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

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

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