首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么空对象比非空对象占用更多的内存?

问为什么空对象比非空对象占用更多的内存?
EN

Stack Overflow用户
提问于 2019-11-26 13:21:44
回答 1查看 172关注 0票数 1

我发现V8对象有相当多的内存开销:我有一个主要是空对象的数组;它需要每个元素高达64字节。(相比之下,Java需要16个字节。)

代码语言:javascript
复制
$ 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%的内存使用量。

代码语言:javascript
复制
$ 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

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

代码语言:javascript
复制
$ 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
EN

回答 1

Stack Overflow用户

发布于 2019-11-26 13:45:19

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

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

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

部分信息是从阅读V8博客文章中拼凑而成的,以及来自Matt Zeunert的信息量非常丰富的细分:https://www.mattzeunert.com/2017/03/29/v8-object-size.html

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59044239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档