Chrome / V8如何处理javascript中的大对象?

问题描述 投票:0回答:1

我试图了解我在Windows 10上使用Chrome / V8时看到的垃圾回收行为。这种情况是我有一个小程序,它以大约60Hz的速率从websocket接收〜1MiB的图像数据。我正在使用Chrome版本81.0.4044.113(正式版本)(64位))和Windows 10 Pro 1903。

最小接收代码如下:

var connection = new WebSocket('ws://127.0.0.1:31333');

connection.onmessage = message => {
    var dataCopy = new Uint8Array(message.data, 0);
};

Chrome中的配置文件显示分配的锯齿上升,直到发生重大垃圾收集为止,并定期重复进行。分配全部为176个字节,与预期的1 MiB实际不匹配。

profile heap graph

我发现了V8 GC here的出色概述。如果我理解正确,当次要清除类型的GC可能会分配这些分配时,我看到主要的GC事件似乎有点令人惊讶。此外,如上所述,分析时看到的分配没有预期的1MiB大小。

[进一步的研究表明,存在一个this SO问题中描述的“大对象空间”。不幸的是,自从提出问题以来,提到的Wiki已经发生了变化,在新的location上我找不到对“大对象空间”的任何引用。我怀疑1MiB分配可能足够大,可以当作一个大对象使用;如果这样,我想确认一下这些对象的实际行为是什么。

所以我的问题是:

  • 为什么我看到主要GC定期发生这种现象?
  • 为什么分配少于预期?
  • 如果与大对象处理有关,有任何官方资源说明在Chrome / V8中如何处理大对象以及它们周围的限制是什么?
javascript google-chrome garbage-collection v8
1个回答
0
投票

最后,我为V8 here提交了一个错误,答案是需要主要GC,因为消息对象是在Blink的堆上分配的,这需要V8执行主要GC来协作回收内存。 176个字节的对象很可能是指向堆上ArrayBuffer的指针。有一个正在进行的项目可以使Blink的GC世代相传,最终将改变这种行为。

© www.soinside.com 2019 - 2024. All rights reserved.