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

Posted

技术标签:

【中文标题】for循环中的Javascript内存使用情况【英文标题】:Javascript memory usage in for loop 【发布时间】:2015-03-11 09:24:23 【问题描述】:

我尝试在 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

我的问题是:

    a.length 和 b.length 只有 ~ 65 MB,为什么文件 1.js 中的内存使用 ~1000 MB 和文件 2.js 中的 ~1400 MB 在第一次垃圾收集后,不会收集 var b,但文件 1.js 的内存使用量似乎仍然 > 1000 MB,但文件 2.js 的内存使用量约为 700 MB?

在第二次垃圾回收之后,内存下降到

【问题讨论】:

【参考方案1】:

你有两个大括号

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

也许这就是函数行为不端的原因。

【讨论】:

以上是关于for循环中的Javascript内存使用情况的主要内容,如果未能解决你的问题,请参考以下文章

无限循环中的NodeJS内存消耗

c++ 在 for 循环中的 vector<char> 中的 for 循环中的内存分配

for循环和while循环的区别?

for循环和while循环的区别?

for 循环期间的动态分配会造成内存泄漏吗?

使用 Rcpp 在 C++ 函数的 R 中使用 for 循环的内存问题