每当我使用spawn(Mod, Func, Arguments)
时,都会复制所有参数。如果在Erlang中一切都是不可变的,为什么要复制它们?为什么不只是复制指针?是因为这会使垃圾收集变得更加复杂吗?
答案 0 :(得分:6)
目前,Erlang VM维护separate heap per process *。这意味着进程可以独立于其他进程收集垃圾,这使得Erlang比保持全局堆的运行时更不容易受到GC暂停的影响。
为了使其有效,必须没有进程引用在另一个进程的堆上分配的内存。 推测,复制发送到spawn/3
的参数的原因是它们被移动到新生成的进程堆中。顺便提一下,发送给进程的消息也是如此(来源:见上面的链接):
复制Erlang进程之间消息中的所有数据,但同一Erlang节点上的refc二进制文件除外。
(*)您可能喜欢在Erlang中阅读有关垃圾收集的this blog post。它实际上比我在开始时说的要复杂一些,因为一些对象(特别是原子和大二进制文件)是分开处理的。
Robert Virding在下面的评论中添加了以下内容:
每个进程具有单独的堆使得GC更简单,更高效,每次传递都可以回收比实时收集器更多的内存。此外,它在并行系统中的扩展性能要好得多,因为锁定更少,同步更少,从而导致速度降低。它还可以提供更好的内存和缓存性能。这是听起来更糟糕但最终变得更好的事情之一。