js栈内存和堆内存的区别

JavaScript09

js栈内存和堆内存的区别,第1张

这很好理解,比如说这么个函数:

function sum(i)

{

if (i == 1) return 1

return i + sum(i - 1)

}

显然,这是一个递归函数,函数自己调用自己。

那么每个调用,都必须保存一个i的变量。

此时就要用堆栈。堆栈的栈顶始终保持着函数的局部变量。当函数返回,则往回收缩,这多方便。

而堆呢?适合全局的、一般的存储。

递归最容易导致的问题就是堆栈溢出了,一般来说操作系统给一个进程划分的栈内存是2M(好像是),按照正常的程序处理,局部变量进栈出栈,栈不太可能会溢出,但是递归会导致不会出栈,这就有可能导致堆栈溢出,你这里定义两个int型变量,即8字节,再加上保存的函数地址等信息,*100000次递归,还有一些其他的入栈的局部变量,可能已经超出了最大的栈空间,所以溢出。

栈是线程的,不是进程的

是一个进程一个堆,一个线程一个栈吗

堆≈虚拟内存大小-1GB

栈通常为4MB

下面是一些说明文件:

Visual C++ 编译器选项

/F(设置堆栈大小)

请参见 发送反馈意见

设置程序堆栈大小(以字节为单位)。

/F[ ]number

参数

number

堆栈大小(以字节为单位)。

备注

如果不使用此选项,堆栈大小默认为 1 MB。number 参数可以用十进制或 C 语言表示法表示。参数的范围可以在 1 到链接器接受的最大堆栈大小之间。链接器将指定值向上舍入为最接近的 4 个字节。/F 和 number 之间的空格可选的。