【问题标题】:Where does V8's large object space reside?V8 的大对象空间在哪里?
【发布时间】:2020-04-23 00:58:16
【问题描述】:

正如标题所说,我试图找出 V8 的大对象空间位于何处。我在 Node JS 中做了一些实验,我将相当大的对象(+50mb)加载到内存中。据我了解,这些对象应该直接存储到大对象空间中。但是,process.memoryUsage() 没有显示出任何存储这些对象的迹象。但是对象肯定在某个地方……那么,如果不在进程堆中,那么大对象空间在哪里?

an old commit in V8's repository我偶然发现,上面写着:

大对象( > Page::kMaxRegularHeapObjectSize )被分配并 由大对象空间管理。从 OS 分配大对象 具有额外填充字节的堆(Page::kPageSize + 页::kObjectStartOffset)。大对象总是从 Page::kObjectStartOffset 到一个页面。大物体在过程中不动 垃圾回收。

所以我想知道:

  • 从操作系统的堆中分配大对象是什么意思?据我所知,堆与任务绑定,我不明白 V8 如何将内存存储到一个不属于它自己的堆中,更多的是在操作系统的堆上。我这里一定是错的,所以请纠正我!
  • 这是我的 Node JS 进程显示正常内存消耗的原因吗?

谢谢!

【问题讨论】:

标签: javascript node.js memory v8


【解决方案1】:

从操作系统的堆中分配大对象是什么意思?

它正在向操作系统请求内存。

V8 的大对象空间在哪里?

在进程的(堆)内存中,就像所有其他空间一样。

我在Node JS中做过一些实验

如果您提供更多详细信息,我可以更好地猜测可能发生的事情。也许你正在使用 TypedArrays?这些是经过特殊处理的,它们的后备存储(超过一定大小)不存储在托管堆上。

【讨论】:

  • 嘿!我执行了一些测试,通过 http 将大文件传递到在 Hapi 上运行的节点 js 服务器。我无法检测到存储在内存中的文件,尽管它们被正确发送和接收。我再次进行了实验,这次没有中间件,我设法检测到存储在堆中的文件!也许 Hapi 正在做一些奇怪的事情,或者我只是没有相应地执行测试(这是最有可能的情况)。感谢您的澄清,这就是我正在寻找的答案!
猜你喜欢
  • 2010-10-16
  • 2012-09-25
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多