【问题标题】:How does JavaScript(or NodeJS) handle memory allocation?JavaScript(或 NodeJS)如何处理内存分配?
【发布时间】:2020-03-24 18:15:09
【问题描述】:

假设 V8 上下文。

假设 Number 类型的元素大小为 4 个字节。

现在,如果我有一个数组,

let a = [1,2,3,4,5];

从逻辑上讲,每个元素的block的起始地址应该是1000,1004,1008,1012,1016

现在,假设我们有一个需要 10 个字节的字符串 TestString,我会这样做:

a[2] = 'TestString';

这样数组就变成了[1,2,'TestString',4,5]

JS如何处理TestString的内存分配和数组中block的地址空间管理?

【问题讨论】:

  • 数组不一定是数组。 V8 为此使用了各种内部表示。

标签: javascript node.js memory memory-management v8


【解决方案1】:

JavaScript 中的数组实际上只是一种特殊类型的对象。因此,数组的“索引”实际上只是存储整数值的属性,而存储的数据只是指向已分配内存块的指针——非常类似于链表。

这就是为什么您可以在现有数组上使用诸如 push 或 pop 之类的数组方法,而无需重新分配为数组预留的内存块。

我不知道 V8 正在做什么的确切细节,但我会假设由于 JavaScript 的松散/动态类型性质,它可能不会像您在示例中使用的那样连续分配内存——只有对于这种弱且动态类型的语言来说,潜在的缺点太多了。

JavaScript 基本上使 everything 成为一个对象。数组是一个对象,数组的索引值,只是指向对象的指针。这就是为什么每种数据类型都是变量并且可以访问属性和方法的原因。

实际上,以下地址空间:

let a = [1, 2, 3, 4, 5];

将是指向已分配内存块的指针,例如 548995、48885、3889282、093838、7883344。或类似的东西。当你重新分配它们中的任何一个时,JavaScript 会在堆中找到一块内存并将数组索引值设置为分配的块的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    相关资源
    最近更新 更多