Javascript / Node.js引擎如何在内存中存储JSON?

我有一个70 MB的JSON文件,我从一个Node.js脚本读取并分配给一个variables。

console.log(process.memoryUsage()); let data=require('../newJSON.json'); console.log(process.memoryUsage()); 

输出:

 { rss: 28184576, heapTotal: 6283264, heapUsed: 4199672, external: 8252 } { rss: 724721664, heapTotal: 695595008, heapUsed: 663708016, external: 8252 } 

看来,70 MB的JSON需要632 MB的内存。 我有兴趣了解JSON如何通过Node Js / Javascript存储到内存中?

首先,JSON只是对象的string表示。 没有什么特别的“JSON对象”–JSONparsing器parsingJSONstring并从中创build常规的JavaScript对象。 这个:

 var a = JSON.parse('{"foo": "bar"}'); 

和这个:

 var a = new Object(); a.foo = "bar"; 

是完全等同的。


内存中的对象存储是复杂的,因为现代的JavaScript引擎对各种不同的情况都有非常漂亮的优化,取决于你的代码在做什么。

JSONstring的长度和内存中相应对象的大小并不严格相关; 在大多数情况下,JSON表示预计会变小,有时会变得很多。 例如,对于你的例子的最内层嵌套: "a":0,需要6个字节,而对于创build的对象中的一个更多的属性,你需要:

  • 一个指针为财产的名字,“一个”
  • 一个属性属性的指针(可写,可枚举,可configuration)
  • 一个属性值为0的指针
  • 假设对象处于字典模式:平均而言,约有两个松弛指针

在一个64位平台上,总共可以达到40个字节。

如果您查看类似形状的整个对象: {"a":0,"b":1}是13个字符,而内存要求是:

  • “地图”指针
  • “元素”指针(未使用)
  • 超出对象的“属性”指针(未使用)
  • 第一个属性的值(0)
  • 第二财产的价值(1)
  • 该对象的“映射”:11个指针(可以与其他具有相同形状的对象共享,但是如果只有一个这样的对象,则没有任何东西可以共享)
  • 该对象的映射的属性描述符:10个指针

总共有26个指针或208个字节。

最后,您可能会发现某些内存使用情况是由GC随着时间的推移而清理的临时对象造成的。