v8如何在碎片化的内存中存储数组
How v8 stores arrays in a fragmented memory
我想知道v8是如何解决碎片化内存存储数组的问题的。基本上,v8 中的数组数据结构是什么。我假设在引擎盖下 v8 必须处理内存碎片问题。我读过 C 分配的数组具有连续的内存,这是有道理的,因为无论如何你都是直接分配它。但是 JavaScript 它是动态的,所以你似乎不能总是连续分配它们。
给定 8 个字节的空闲内存块 ○ 并已分配 ●,想象一下这种情况。
○○○○○○○○○○○○○○○○○○○○○○○○○○○
然后添加一个包含 5 个项目的数组:
●●●●●○○○○○○○○○○○○○○○○○○○○○○
然后将另一个数组添加到内存的不同部分:
●●●●●○○○○◖◖◖○○○○○○○○○○○○○○○
问题是,如果你在第一个数组中再添加 10 个项目,它是如何工作的:
●●●●●●●●●◖◖◖●●●●●●○○○○○○○○○
想知道您是否在其他地方跟踪数组结构,而不仅仅是跟踪它们是连续的(如在 C 中)。
这里是 V8 开发人员。每个数组(sparse/dictionary 和 dense/array 模式)都有 one 元素的后备存储。当添加的元素超过后备存储可以容纳的数量时,将分配一个新的后备存储并复制所有元素。在这种情况下,后备存储按一个因子(不仅仅是一个元素)增长,这就是为您提供摊销常数元素添加性能的原因。当没有足够的内存(或连续内存)用于新的后备存储时,V8 会因内存不足错误而崩溃。
我想知道v8是如何解决碎片化内存存储数组的问题的。基本上,v8 中的数组数据结构是什么。我假设在引擎盖下 v8 必须处理内存碎片问题。我读过 C 分配的数组具有连续的内存,这是有道理的,因为无论如何你都是直接分配它。但是 JavaScript 它是动态的,所以你似乎不能总是连续分配它们。
给定 8 个字节的空闲内存块 ○ 并已分配 ●,想象一下这种情况。
○○○○○○○○○○○○○○○○○○○○○○○○○○○
然后添加一个包含 5 个项目的数组:
●●●●●○○○○○○○○○○○○○○○○○○○○○○
然后将另一个数组添加到内存的不同部分:
●●●●●○○○○◖◖◖○○○○○○○○○○○○○○○
问题是,如果你在第一个数组中再添加 10 个项目,它是如何工作的:
●●●●●●●●●◖◖◖●●●●●●○○○○○○○○○
想知道您是否在其他地方跟踪数组结构,而不仅仅是跟踪它们是连续的(如在 C 中)。
这里是 V8 开发人员。每个数组(sparse/dictionary 和 dense/array 模式)都有 one 元素的后备存储。当添加的元素超过后备存储可以容纳的数量时,将分配一个新的后备存储并复制所有元素。在这种情况下,后备存储按一个因子(不仅仅是一个元素)增长,这就是为您提供摊销常数元素添加性能的原因。当没有足够的内存(或连续内存)用于新的后备存储时,V8 会因内存不足错误而崩溃。