为什么原子不被 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标记步骤中完全可以省略。
好吧,标题说明了一切:我想知道 BEAM 不对原子进行垃圾收集的原因是什么。我知道问题 How Erlang atoms can be garbage collected 但是,虽然相关,但它没有回复 why.
因为在当前的设计中这是不可能的(或者至少很难)。原子是以下的重要组成部分:
- 模块,因为模块名称是原子
- 函数名,也是原子
- 分布式 Erlang 也广泛使用原子
尤其是最后一点很难。想象一下,我们将有一个原子 GC。如果在我们通过线路发送一些原子的分布式调用之间进行 GC 清理,会发生什么情况?所有这些使得原子对于 VM 的工作方式非常重要,并且使它们被 GC 处理不仅会使 VM 的实现变得更加复杂,而且还会使代码变慢得多,因为原子不需要在进程之间复制,而且这些原子不会被 GC 处理,这些在GC标记步骤中完全可以省略。