为什么factoral不会在Erlang中溢出堆栈?

时间:2016-08-16 06:29:01

标签: erlang

-module(demo).
-export([factorial/1]).

factorial(0) -> 1;
factorial(N) -> 
    N * factorial(N-1).

阶乘不是尾递归,但为什么它不会溢出堆栈?我能够在没有堆栈溢出的情况下得到100,000因子,但需要一些时间来计算。

1 个答案:

答案 0 :(得分:7)

Erlang进程的“堆栈”不存储在系统给进程的堆栈中(通常是几兆字节),而是存储在堆中。据我所知,在系统拒绝为VM提供更多内存之前,它将无限增长。

  

大小包括堆区域的233个单词(包括堆栈)。垃圾收集器根据需要增加堆。

     

进程的主(外部)循环必须是尾递归的。否则,堆栈会一直增长,直到进程终止。

Source

如果您在OSX上的活动监视器或其他类UNIX系统上的top等进程监视器中监视Erlang VM进程,您将看到在计算完成之前内存使用量将继续增加,此时内存的一部分(存储“堆栈”的那一部分)将被释放(这在函数返回后的几秒内会逐渐发生)。