我发现在NodeJS上使用ES6 new Set()会增加字符串输入的内存消耗,即使重复值也是如此。请参阅下面的示例,将1到1e6写入整数和字符串中的Set。
整数版本将保留~60MB的RSS使用率。如果字符串中的相同数字将导致RAM的消耗增加,则在脚本结束时它会占用近1GB的RAM。有什么想法吗?
'use strict';
// Integer
let setA = new Set();
for(let i=0; i<=3e7; i++){
setA.add(i%1e6);
if(i%1e6 == 0){
console.log("Now: ", i)
let m = process.memoryUsage();
console.log('RSS ' + Math.round(m['rss']/1024/10.24)/100 +
' MB, heapTotal ' + Math.round(m['heapTotal']/1024/10.24)/100 +
' MB, heapUsed ' + Math.round(m['heapUsed']/1024/10.24)/100 +
' MB, external ' + Math.round(m['external']/1024/10.24)/100 +
' MB\n');
}
}
setA = {};
// String
let setB = new Set();
for(let i=0; i<=3e7; i++){
setB.add((i%1e6) + '');
if(i%1e6 == 0){
console.log("Now: ", i)
let m = process.memoryUsage();
console.log('RSS ' + Math.round(m['rss']/1024/10.24)/100 +
' MB, heapTotal ' + Math.round(m['heapTotal']/1024/10.24)/100 +
' MB, heapUsed ' + Math.round(m['heapUsed']/1024/10.24)/100 +
' MB, external ' + Math.round(m['external']/1024/10.24)/100 +
' MB\n');
}
}
&#13;
答案 0 :(得分:0)
我可以使用Node v6重现这一点,但不能使用Node v8,所以我猜有一个实现(或者可能是GC?)问题在这两个版本之间得到解决。
v8的最终结果:
Now: 30000000
RSS 99.11 MB, heapTotal 85.5 MB, heapUsed 79.16 MB, external 0.01 MB
(虽然 max RSS约为350MB,但我认为差异是因为垃圾收集)