node 中闭包内存如何释放
发布于 10 年前 作者 xuyufei 8816 次浏览 最后一次编辑是 8 年前

最近在用node做游戏服务器的开发,发现了闭包导致的内存泄漏问题。

举个例子

function func1(c)
{  
   c(); 
}
 

function func2()
{ 
    func1(
       function(){
            var obj_content={};//变量在回调函数内部
            for(var i=0;i<20000000;i++){
            obj_content[i]=i;
       }

      console.log(obj_content[1]);
      obj_content=null;//把变量设置为空也不能释放
    })
}


func2();//执行func2函数

setInterval(function(){console.log("aaa")},1000);//设置定时器,保持进程不会停止

然后再Linux下运行,发现内存一直被占用,不能释放。 obj_content=null; 这个代码已经把变量设置为null了,可为什么内存还是一直被占用呢?(使用delete删除对象obj_content的属性也不可以)

19 回复

先 delete obj_content[i]

you can’t control . CG smart recovery of memory.


签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3

var obj_content=null;//把变量设置为空也不能释放

#大哥,错了,用了var就是重新定义了另一个变量,不是原来的那个了。。。

var obj_content=null;

And it has nothing to do.

you can’t control . CG smart recovery of memory.


签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3

可以把代码格式弄好点再问问题么

这貌似不是必包,回调函数是在f2运行的,如果要释放也不是通过var xx = null,这样的话就定义了一个地址空间,并没有引用值,用delete的话,只能删除属性和没有用var定义的全局变量,只能xx = null;

不好意思,我第一次使用这个论坛,然后发现发布了之后不能修改编辑,我也知道写错了,但是没办法修改,其实你把那个 var 去掉内存也不可以释放。

具体代码如下:

function aa(cc) {
cc();
}

function bb() {

aa(function(){ var obj={};//变量在回调函数内部

 for(var i=0;i<20000000;i++)
 {
   obj[i]=i;
 }
 console.log(obj[1]);
 obj=null;//把变量设置为空,内存也不能释放

}) } bb();

bb=null; aa=null;

//设置定时器,保持进程不退出 setInterval(function(){console.log()},1000);

就是这段完整的代码,知道怎么释放掉内存吗,发现内存一直被占用。

不可以,不起作用

不可以,不起作用啊

不好意思,第一次使用没有发现编辑按钮,现在修改了

修改了,把var去掉也不可以

可以等了好几个小时内存也不能释放

you can’t control , CG auto.


签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3

function func1© {
c(); }

function func2() { func1( function(){ var obj_content={};//变量在回调函数内部 for(var i=0;i<20000000;i++){ obj_content[i]=i; }

  console.log(obj_content[1]);
  obj_content=null;//把变量设置为空也不能释放
})

}

for(var i=0;i<10000000;++i) func2();//执行func2函数

setInterval(function(){console.log(“aaa”)},1000);//设置定时器,保持进程不会停止

写成这样 你就能发现内存回收了。估计因为没有新增的内存,node觉得没必要进行回收吧,或者在开新内存的时候才会考虑开始回收。

you can’t control , CG auto.

if second run , memory is small increase memory , this is because second direct use first memory.

签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3

@brighthas 是的,GC不能控制,是自动的,但是内存一直居高不下,总说不过去吧。

真是这样,后面的定时器改成:

setInterval( function() { var obj1={}; for(var i=0;i<10000;i++) { obj1[i]=i; }

} ,1000);

内存就能回收了,果然想你说的那样:因为没有新增的内存,node觉得没必要进行回收吧,或者在开新内存的时候才会考虑开始回收。原来GC是这样的回收机制。感谢

@xuyufei yes , use old memory.

签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3

回到顶部