javascript - 为什么 JavaScript 循环不会溢出堆栈?

标签 javascript node.js v8

我有几个关于 JavaScript 内存分配的问题

据我所知,JavaScript 原语是不可变的并存储在堆栈中。如果我们更改原语的值,或者将新变量分配给旧变量,它会为每种情况创建一个新的内存位置。

let x = 2 
let y = x
x = 3
console.log(y) // 2

  1. 当我们运行一个大循环时,如下例所示,堆栈中需要 99999999 乘以 8 字节来为 i 分配空间。那么,为什么栈没有溢出呢?
    for(let i = 0; i<99999999; i++){
       let x = i
    }
  • 如果同时创建数百万个对象(在现实世界的应用中),堆栈是否足以保存对堆中所有对象的引用?
  • 最佳答案

    (这里是 V8 开发人员。)

    1. 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... 次,都不会改变它需要多少堆栈空间。

    1. 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/

    相关文章:

    javascript - 页面滚动到 div 的底部

    node.js - 抑制 chai 中的日志输出

    javascript - Nodejs延迟返回 "require"

    javascript - 是否可以在 Node 7 中使用 --harmony_async_await 跨异步/等待边界获取堆栈跟踪?

    javascript - 在 chrome 背景选项卡中自动播放声音

    javascript - 单击取消按钮时无法停止执行

    javascript - VSCode ESLint 异步函数不支持

    node.js - 从 Node 中的 url 将视频上传到 Twitter

    javascript - 如何从 v8 shell 运行外部 javascript 文件?

    c++ - 如何在 Google V8 Javascript 引擎中使对象不可变?