我有几个关于 JavaScript 内存分配的问题
据我所知,JavaScript 原语是不可变的并存储在堆栈中。如果我们更改原语的值,或者将新变量分配给旧变量,它会为每种情况创建一个新的内存位置。
let x = 2
let y = x
x = 3
console.log(y) // 2
- 当我们运行一个大循环时,如下例所示,堆栈中需要 99999999 乘以 8 字节来为 i 分配空间。那么,为什么栈没有溢出呢?
for(let i = 0; i<99999999; i++){
let x = i
}
- 如果同时创建数百万个对象(在现实世界的应用中),堆栈是否足以保存对堆中所有对象的引用?
最佳答案
(这里是 V8 开发人员。)
- When we run a large loop just as the example bellow, 99999999 times 8bytes needed in stack to allocate space for i. So, why the stack is not overflown?
前提不正确。 i
只有一个堆栈槽。循环的每次迭代都会重用它。因此,无论此循环运行一次、两次、100 次、还是 9999... 次,都不会改变它需要多少堆栈空间。
- If millions of objects are created simultaneously (in a real world app), is the stack enough to hold references to all the objects in the heap?
可用堆栈大小略小于一兆字节(这是由操作系统决定的);在 64 位平台上,这足以容纳大约 100K 指针,这(非常粗略地)转换为分布在当前激活的所有函数中的数万个局部变量(没有具体数字,因为“这取决于”)。因此,堆上当然可能有比直接从堆栈引用的对象更多的对象,但这通常不是代码遇到的限制:例如,您可以有一个指向数组的局部变量,并且该数组又可以引用数千个其他对象。这样,单个堆栈槽就可以轻松访问许多对象。
(挑剔:数以百万计的对象永远不会“同时”创建,它们总是在彼此之后分配,也许是快速连续地分配。)
关于javascript - 为什么 JavaScript 循环不会溢出堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73611158/