for循环中的Javascript内存使用

标签 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 而文件 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

也许这就是函数运行异常的原因。

关于for循环中的Javascript内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27921854/

相关文章:

c - 向 c 程序添加任何单行代码时写入套接字都会失败

android - 我必须删除 GLSurfaceView 中的纹理吗?

ios - ViewControllers 没有破坏

javascript - 点击提交后,React js中输入没有提交

php - 在php中查找所有选中复选框的值

javascript - Node 获取数据后如何在 AngularJS 中使用 $get 请求?

javascript - 如何将对象的键和子键数组转换为指向某些属性值的链接?

javascript - 在 JavaScript 中引用操作字段

node.js - SSL 检查错误 :CERT_UNTRUSTED when adding meteor package

抛出的 JavaScript 异常不是类型 "Error"