node.js - 为什么空对象比非空对象占用更多内存?

标签 node.js optimization memory v8 jit

我发现 V8 对象有相当多的内存开销:我有一个大部分为空对象的数组;每个元素需要 64 字节之多。 (作为比较,Java 需要 16 个字节。)

$ node --expose-gc  -e '
  gc();
  const start = process.memoryUsage().heapUsed;
  var a = Array(50 * 1000);
  for (let i = 0; i < a.length; i++) a[i] = {};
  gc();
  console.log(process.memoryUsage().heapUsed - start)
'
3231304

然后我发现通过向对象添加虚拟属性可以将内存使用量减少 37%。

$ node --expose-gc  -e '
    gc();
    const start = process.memoryUsage().heapUsed;
    var a = Array(50 * 1000);
    for (let i = 0; i < a.length; i++) a[i] = {lifeTheUniverseAndEverything:42};
    gc(); 
    console.log(process.memoryUsage().heapUsed - start)
'
2028440

为什么向对象添加属性会减少内存使用量?

$ node -v
v12.7.0

$ uname -a
Linux paul 4.15.0-70-generic #79-Ubuntu SMP Tue Nov 12 10:36:11 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

最佳答案

Node (V8) 做出以下假设:如果您的对象为空{},那么它可能会添加属性。因此,它为对象本身的四个属性分配了足够的空间。

另一方面,如果对象字面量已经具有属性,那么它将不会分配任何额外的空间来节省内存。

这就是为什么您会看到空对象占用约 64 个字节。

部分信息是通过阅读 V8 博客文章以及 Matt Zeunert 提供的信息丰富的分割而拼凑而成的:https://www.mattzeunert.com/2017/03/29/v8-object-size.html

关于node.js - 为什么空对象比非空对象占用更多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59044239/

相关文章:

c++ - 增量挑战 :++ vs. +1

css - 如何在没有两次相同代码的情况下排列代码?

windows - 在 Windows 上安装 npm 模块时出现 "cannot find module"

css - 文件观察器 JetBrains IDE 中的自动前缀器

MySQL优化简单数据库

python - pandas 数据帧的准确内存使用估计

C 正确使用 free

c - 我在 C 中的字节是如何存储的?

javascript - 忽略 SetInterval 函数期间的错误并继续

node.js - 在另一个应用程序中嵌入 NodeJs 与 JXCore