我发现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发布于 2019-11-26 13:45:19
{} (V8)做了以下假设:如果你的对象是空的Node,那么它可能会添加一些属性。因此,它为对象本身中的四个属性分配了足够的空间。
另一方面,如果对象文字已经有了属性,那么它将不会分配任何额外的空间来节省内存。
这就是为什么您看到空对象占用大约64个字节。
部分信息是从阅读V8博客文章中拼凑而成的,以及来自Matt Zeunert的信息量非常丰富的细分:https://www.mattzeunert.com/2017/03/29/v8-object-size.html
https://stackoverflow.com/questions/59044239
复制相似问题