好吧,标题说明了一切:我想知道BEAM不垃圾收集原子的原因是什么。我知道Erlang原子如何被垃圾收集的问题,但尽管相关,它并没有回答为什么。
因为这在当前设计中是不可能做到的(或者至少很难做到(。原子是的重要组成部分
- 模块,因为模块名称是原子
- 函数名,也是原子
- 分布式Erlang也广泛使用原子
特别是最后一点让比赛变得艰难。想象一下,我们有一个原子的GC。如果在我们通过有线发送一些原子的分布式调用之间进行GC清理,会发生什么?所有这些都使得原子对VM的工作方式非常重要,使它们GCed不仅会使VM的实现更加复杂,还会使代码变得更慢,因为原子不需要在进程之间复制,而且由于这些原子没有GCed,所以在GC标记步骤中可以完全省略这些原子。