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

Javascript memory usage in for loop

本文关键字:用情 情况 内存 JavaScript 循环 for      更新时间:2023-09-26

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

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

运行 A 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 中的内存使用 ~1000 MB.js文件2中的内存使用 ~1400 MB.js
  2. 在第一次垃圾回收之后,是否会收集 var b,但看起来文件 1000 的内存使用量仍然> 1000 MB.js,但在文件 700 中为 2.js MB?

第二次垃圾回收后,内存将下降到<20 MB,正如预期的那样。我在这里看错了吗?

你有两个大括号

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

也许这就是功能行为不端的原因。

相关文章: