Arrays v8如何在碎片内存中存储阵列

Arrays v8如何在碎片内存中存储阵列,arrays,google-chrome,v8,Arrays,Google Chrome,V8,我想知道v8如何解决在碎片内存中存储阵列的问题。基本上,v8中的数组数据结构是什么。我认为引擎盖下的v8必须处理内存碎片的问题。我已经读到C分配了带有连续内存的数组,这是有意义的,因为您直接分配它。但是JavaScript是动态的,所以您似乎无法始终连续地分配它们 给定8字节的可用内存块○ 分配●, 想象一下这种情况 ○○○○○○○○○○○○○○○○○○○○○○○○○○○ 然后添加一个包含5项的数组: ●●●●●○○○○○○○○○○○○○○○○○○○○○○ 然后将另一个数组添加到内存的不同部

我想知道v8如何解决在碎片内存中存储阵列的问题。基本上,v8中的数组数据结构是什么。我认为引擎盖下的v8必须处理内存碎片的问题。我已经读到C分配了带有连续内存的数组,这是有意义的,因为您直接分配它。但是JavaScript是动态的,所以您似乎无法始终连续地分配它们

给定8字节的可用内存块○ 分配●, 想象一下这种情况

○○○○○○○○○○○○○○○○○○○○○○○○○○○
然后添加一个包含5项的数组:

●●●●●○○○○○○○○○○○○○○○○○○○○○○
然后将另一个数组添加到内存的不同部分:

●●●●●○○○○◖◖◖○○○○○○○○○○○○○○○
问题是,如果在第一个数组中再添加10个项目,它是如何工作的:

●●●●●●●●●◖◖◖●●●●●●○○○○○○○○○

想知道您是否在其他地方跟踪数组结构,而不仅仅是它们是连续的(如在C中)。

。每个数组(稀疏/字典和密集/数组模式)都有一个元素的备份存储。当添加的元素超过备份存储所能容纳的数量时,将分配一个新的备份存储并复制所有元素。在这种情况下,支持存储是按一个因子(而不仅仅是一个元素)增长的,这就是提供摊销常量元素添加性能的因素。当没有足够的内存(或连续内存)用于新的备份存储时,V8会崩溃并出现内存不足错误。

我认为V8 GC中存在压缩。如果数组不合适,则会预先分配一些额外的空间-这只是重新分配而已。@zerkms如果内存已接近满,没有空间连续填充整个数组,但有空间将其碎片化,该怎么办。另外,重新分配似乎会影响性能,但我不确定。在这种情况下,分配失败。“性能影响”-性能不是绝对指标。与“什么”相比,这是一种影响?如果你不这样做,你就必须处理映射数组,因此,你不需要支付一次低成本的重新分配(计算机可以很好地复制连续的内存片),而是每次查找时都要支付该成本。