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

时间:2015-01-13 12:09:47

标签: javascript node.js memory memory-management garbage-collection

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

运行

var a和var b初始化为空字符串

运行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,文件中为〜1400 MB
  2. 在第一次垃圾收集之后,不会收集varn b但是看起来内存使用情况仍然是>文件1.js为1000 MB,文件2.js为~700 MB?
  3. 第二次垃圾收集后,内存降至<正如预期的那样,20 MB。我在这看错了吗?

1 个答案:

答案 0 :(得分:0)

你有两个大括号

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

也许这就是为什么这些功能行为不端。