javascript - V8 的大对象空间在哪里?
问题描述
正如标题所说,我试图找出 V8 的大对象空间在哪里。我在 Node JS 中做了一些实验,我将相当大的对象(+50mb)加载到内存中。据我了解,这些对象应该直接存储到大对象空间中。然而,process.memoryUsage()
没有显示出任何存储这些对象的迹象。但是对象必须在某个地方......那么,如果不在进程堆中,那么大对象空间在哪里?
在我偶然发现的V8 存储库中的一个旧提交中,它显示:
大对象( > Page::kMaxRegularHeapObjectSize )由大对象空间分配和管理。一个大对象是从 OS 堆中分配的,带有额外的填充字节(Page::kPageSize + Page::kObjectStartOffset)。一个大对象总是从 Page::kObjectStartOffset 开始到一个页面。大对象在垃圾回收期间不会移动。
所以我想知道:
- 它从操作系统的堆中分配大对象是什么意思?据我所知,堆与任务绑定,我不明白 V8 如何将内存存储到一个不属于它自己的堆中,更多的是在操作系统的堆上。我在这里一定是错的,所以请纠正我!
- 这是我的 Node JS 进程显示正常内存消耗的原因吗?
谢谢!
解决方案
它从操作系统的堆中分配大对象是什么意思?
它正在向操作系统请求内存。
V8 的大对象空间在哪里?
在进程的(堆)内存中,就像所有其他空间一样。
我在 Node JS 中做了一些实验
如果您提供更多详细信息,我可以更好地猜测可能发生的事情。也许你正在使用 TypedArrays?这些是特殊处理的,它们的后备存储(超过一定大小)不存储在托管堆上。
推荐阅读
- php - 当您对 laravel 8 中的输入组件有验证错误时发送引导类
- python - 将数据(结果)从一个对象方法写入另一个类/方法
- javascript - 如何使用 Puppeteer buildpack 加速 Heroku 部署?
- python - 通过 Django admin 到 postgres 的新单个插入的“ON CONFLICT”错误
- python - 如何比较链表中的节点数据值?
- c# - “ProtoCompile”任务不支持 AdditionalProtocArguments”参数,.Net Core 控制台应用程序
- php - 如何检查Facebook帐户是否存在?
- java - java线程:完成任务时停止所有线程
- c# - 使用 MSTestV2 框架 c# 进行单元测试
- android - 通过 ble 进行第一次数据传输后应用程序冻结