for循环中的Javascript内存使用情况

我试图在nodejs(0.10.35)中剖析内存使用情况,我在下面创build了2个文件并使用node –expose-gc

var a和var b被初始化为空string

运行for循环使a和b变大

setInterval每1秒打印一次内存使用情况

x >> 20运算符等同于Math.floor(x / 1024/1024),以MB为单位给出结果

//file 1.js var a = '', b = '', n = 0; var i = 10000000; for (;i;i--) {a += i; b += i;}} setInterval(function(){ var m = process.memoryUsage(); console.log(++n,m.rss>>20,m.heapTotal>>20,m.heapUsed>>20); },1000); setTimeout(function(){ global.gc(); console.log('1st garbage collect'); },2500); setTimeout(function(){ a = null; console.log('var a cleared'); },5000); setTimeout(function(){ global.gc(); console.log('2nd garbage collect'); },7500); //file 2.js is similar to file 1 except that var a and var b are changed at separate loops var i = 10000000; for (;i;i--) {a += i;} var i = 10000000; for (;i;i--) {b += i;} 

我从控制台得到了结果

  1.js 2.js 1 1098 1073 1069 1407 1378 1375 2 1098 1073 1069 1407 1378 1375 1st garbage collect 3 1098 1073 1069 715 696 688 4 1098 1073 1069 715 696 688 var a cleared 5 1098 1073 1069 715 696 688 6 1098 1073 1069 715 696 688 7 1098 1073 1069 715 696 688 2nd garbage collect 8 19 11 1 20 12 1 

我的问题是:

  1. a.length和b.length只有〜65 MB,为什么在文件1.js中〜1000 MB,在文件2.js中〜1400 MB
  2. 在第一次垃圾收集后,不会收集var b,但是看起来内存使用情况对于文件1.js仍然> 1000 MB,但是在文件2.js中〜700 MB?

在第二次垃圾收集之后,内存降低到<20 MB,正如所料。 我在这里看错了吗?

你有两个括号

 var i = 10000000; for (;i;i--) {a += i; b += i;}}//<-----here 

也许这就是为什么这些function行为不当。