我发现 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/