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

4 erlang

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

factorial(0) -> 1;
factorial(N) -> 
    N * factorial(N-1).
Run Code Online (Sandbox Code Playgroud)

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

Dog*_*ert 7

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

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

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

资源

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