JavaScript(或 NodeJS)如何处理内存分配?
How does JavaScript(or NodeJS) handle memory allocation?
假定 V8 上下文。
假设 Number
类型的元素大小为 4 个字节。
现在,如果我有一个数组,
let a = [1,2,3,4,5];
按理来说,每个元素的块起始地址应该是1000,1004,1008,1012,1016
现在,假设我们有一个需要 10 个字节的字符串 TestString
,我这样做:
a[2] = 'TestString';
这样数组就变成了[1,2,'TestString',4,5]
.
JS如何处理TestString
的内存分配和管理数组中块的地址space?
JavaScript中的数组实际上只是一种特殊类型的对象。因此,数组的“索引”实际上只是存储整数值的属性,存储的数据只是指向分配的内存块的指针——非常像链表。
这就是为什么您可以在现有数组上使用 push 或 pop 等数组方法,而无需重新分配为数组预留的内存块。
我不知道 V8 正在做什么的确切细节,但我假设由于 JavaScript 的 loosely/dynamically 类型性质,它可能不会像这样连续分配内存你在你的例子中使用了——对于这样一种弱动态类型的语言来说,它有太多潜在的缺点。
JavaScript 基本上使 一切 成为对象。一个数组就是一个对象,数组的索引值,只是指向对象的指针。这就是为什么每个数据类型都是变量并且可以访问属性和方法的原因。
实际上,地址空间为:
let a = [1, 2, 3, 4, 5];
将是指向分配的内存块的指针,例如 548995、48885、3889282、093838、7883344。或类似的东西。当您重新分配它们中的任何一个时,JavaScript 将在堆中找到一块内存并将数组索引值设置为分配块的指针。
假定 V8 上下文。
假设 Number
类型的元素大小为 4 个字节。
现在,如果我有一个数组,
let a = [1,2,3,4,5];
按理来说,每个元素的块起始地址应该是1000,1004,1008,1012,1016
现在,假设我们有一个需要 10 个字节的字符串 TestString
,我这样做:
a[2] = 'TestString';
这样数组就变成了[1,2,'TestString',4,5]
.
JS如何处理TestString
的内存分配和管理数组中块的地址space?
JavaScript中的数组实际上只是一种特殊类型的对象。因此,数组的“索引”实际上只是存储整数值的属性,存储的数据只是指向分配的内存块的指针——非常像链表。
这就是为什么您可以在现有数组上使用 push 或 pop 等数组方法,而无需重新分配为数组预留的内存块。
我不知道 V8 正在做什么的确切细节,但我假设由于 JavaScript 的 loosely/dynamically 类型性质,它可能不会像这样连续分配内存你在你的例子中使用了——对于这样一种弱动态类型的语言来说,它有太多潜在的缺点。
JavaScript 基本上使 一切 成为对象。一个数组就是一个对象,数组的索引值,只是指向对象的指针。这就是为什么每个数据类型都是变量并且可以访问属性和方法的原因。
实际上,地址空间为:
let a = [1, 2, 3, 4, 5];
将是指向分配的内存块的指针,例如 548995、48885、3889282、093838、7883344。或类似的东西。当您重新分配它们中的任何一个时,JavaScript 将在堆中找到一块内存并将数组索引值设置为分配块的指针。