【发布时间】:2018-04-23 23:55:00
【问题描述】:
我想知道 v8 如何解决将数组存储在碎片内存中的问题。基本上,v8 中的数组数据结构是什么。我假设在引擎盖下 v8 必须处理内存碎片的问题。我已经阅读了 C 分配的具有连续内存的数组,这是有道理的,因为无论如何您都是直接分配它。但是对于 JavaScript,它是动态的,因此您似乎无法始终连续分配它们。
给定 8 字节空闲 ○ 和已分配的内存块,想象一下这种情况。
○○○○○○○○○○○○○○○○○○○○○○○○○○○
然后添加一个包含 5 个项目的数组:
●●●●●○○○○○○○○○○○○○○○○○○○○○○
然后将另一个数组添加到内存的不同部分:
●●●●●○○○○◖◖◖○○○○○○○○○○○○○○○
问题是,如果你在第一个数组中再添加 10 个项目,它是如何工作的:
●●●●●●●●●◖◖◖●●●●●●○○○○○○○○○
想知道您是否在其他地方跟踪数组结构,而不仅仅是它们是连续的(就像在 C 中一样)。
【问题讨论】:
-
我认为 v8 GC 中有压缩。并且数组有一些预先分配的额外空间,如果它不适合 - 它只是被重新分配。
-
@zerkms 如果内存接近满了,没有空间可以连续填充整个数组,但有空间可以碎片化。此外,重新分配似乎会对性能产生影响,但我不确定。
-
在这种情况下分配失败。 “性能影响”——性能不是绝对的衡量标准。与“什么”相比,这是一种影响?如果您不这样做,则必须处理映射数组,因此不必支付一次低成本的重新分配(计算机非常好地复制连续的内存片) - 您每次查找时都会支付这笔费用。
标签: arrays google-chrome v8