Erlang - 循环和内存分配

时间:2016-12-18 18:02:27

标签: memory-management garbage-collection erlang

在Erlang中为进程创建循环的典型方法是使用递归:

keepAlive(someArg) ->
    % do something,
    keepAlive(someValue)

由于Erlang中的变量是不可变的,当我在这样的循环中声明局部变量时会发生什么?是否在下一次递归调用时收集垃圾?即使没有新变量的声明,也不会像这样循环一个问题并且可能导致堆栈溢出,因为从一个循环到另一个循环得到无数个指针,理论上可能必须一直回到有一点?

1 个答案:

答案 0 :(得分:2)

从技术上讲,在Erlang中没有声明局部变量。他们必将具有价值。局部变量的值存储在堆栈中。某些数据类型可以直接存储在堆栈中,而不必在堆上分配。因此,局部变量不必被垃圾收集,但必须包含一些数据类型的值。无论如何,这些值不会在下一次递归调用中被垃圾收集,但是当堆满足堆栈时,这意味着堆已满且触发了垃圾收集。

最重要的是,如果按照描述的方式编写函数,则在递归调用和参数存储在"寄存器"之前释放堆栈帧。然后下一个递归调用不是函数调用,而只是跳转。这意味着堆栈不会增长。在堆上分配但不再由堆栈或函数参数引用的所有值都可以进行垃圾回收,因此不存在内存泄漏或堆栈溢出。事实上,它是非常简单和优雅的解决方案。

相关问题