Javascript 中堆栈、调用堆栈和内存堆之间的混淆

Vai*_*rma 4 javascript memory-management

我对 Javascript 中的内存分配和函数调用跟踪如何发生感到困惑。我非常确定的一件事是,JS 中有一个调用堆栈,其中函数调用以 LIFO 方式存储。但是当涉及到内存分配时,我很困惑以下哪些参数是正确的:

或者

  • 只有两个东西:调用栈和堆内存。调用堆栈将以 LIFO 方式存储函数调用。而堆内存将存储原始变量或非原始变量。(根据这些视频:https://www.youtube.com/watch?v =7rOpIX-7ErA&t=32s 、 https://www.youtube.com/watch?v= xFNWb7KiG58

如果第一个参数是正确的,那么调用堆栈和堆栈如何相互连接,以便调用堆栈中的函数可以识别从堆栈中选取哪些变量来执行?

Cri*_*ina 5

JavaScript 会将其在编译时知道的大小保留在堆栈上(基元具有固定大小,因此可以将它们放入堆栈,以及对对象的引用 - 这就是为什么有大小限制)。

另一方面,对象和函数在编译时没有已知的固定大小,因此它们需要存储在动态位置(堆)中。它会根据需要分配尽可能多的内存。

堆栈也将用于访问堆(请记住,引用保存在堆栈上)。

当堆栈不包含函数引用或对象引用时,它将被垃圾收集,并且堆将被释放。

JavaScript 有一个引用计数算法来识别堆内存中是否仍然需要任何已分配的变量。

每个函数都是 javascript 中的一个闭包,因此它知道它所需的变量(在上层闭包中定义的变量以及在其中定义的变量)。

希望这可以帮助。

如果您想更深入地了解一切是如何运作的,本文 将涵盖您遇到的问题

堆栈通常是为每个执行函数分配本地上下文的连续内存区域。

LE:

本文对堆栈进行了很好的可视化(在每个函数的本地上下文中关联了原语)

这是堆栈内存区域,每个 V8 进程有一个堆栈。这是存储静态数据的地方,包括方法/函数框架、原始值和对象指针。可以使用 --stack_size V8 标志设置堆栈内存限制。