【问题标题】:How v8 stores arrays in a fragmented memoryv8 如何将数组存储在碎片化内存中
【发布时间】:2018-04-23 23:55:00
【问题描述】:

我想知道 v8 如何解决将数组存储在碎片内存中的问题。基本上,v8 中的数组数据结构是什么。我假设在引擎盖下 v8 必须处理内存碎片的问题。我已经阅读了 C 分配的具有连续内存的数组,这是有道理的,因为无论如何您都是直接分配它。但是对于 JavaScript,它是动态的,因此您似乎无法始终连续分配它们。

给定 8 字节空闲 ○ 和已分配的内存块,想象一下这种情况。

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

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

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

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

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

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

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

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

【问题讨论】:

  • 我认为 v8 GC 中有压缩。并且数组有一些预先分配的额外空间,如果它不适合 - 它只是被重新分配。
  • @zerkms 如果内存接近满了,没有空间可以连续填充整个数组,但有空间可以碎片化。此外,重新分配似乎会对性能产生影响,但我不确定。
  • 在这种情况下分配失败。 “性能影响”——性能不是绝对的衡量标准。与“什么”相比,这是一种影响?如果您不这样做,则必须处理映射数组,因此不必支付一次低成本的重新分配(计算机非常好地复制连续的内存片) - 您每次查找时都会支付这笔费用。

标签: arrays google-chrome v8


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 2010-09-08
    • 2010-10-26
    • 1970-01-01
    • 2011-12-09
    • 2013-05-11
    • 2018-09-25
    • 2012-12-11
    相关资源
    最近更新 更多