v8如何将数组存储在碎片内存中

时间:2018-04-23 23:55:01

标签: arrays google-chrome v8

我想知道v8如何解决在分段内存中存储数组的问题。基本上,v8中的数组数据结构是什么。我假设在引擎盖下v8必须处理内存碎片问题。我已经读过C分配了具有连续内存的数组,这是有道理的,因为你无论如何直接分配它。但是使用JavaScript它是动态的,所以看起来你总是不能连续地分配它们。

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

○○○○○○○○○○○○○○○○○○○○○○○○○○○

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

●●●●●○○○○○○○○○○○○○○○○○○○○○○

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

V8开发者在这里。每个数组(稀疏/字典和密集/数组模式)都有一个元素的后备存储。如果添加的元素多于后备存储可以容纳的元素,则会分配新的后备存储并复制所有元素。在这种情况下,后备存储是通过一个因子(不仅仅是一个元素)来增长的,这就是为您提供分摊的常量元素添加性能。当没有足够的内存(或连续内存)可用于新的后备存储时,V8会因内存不足而崩溃。