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