CNode

node 中闭包内存如何释放

Xxuyufei发布于13 年前最后回复13 年前19 回复9993 浏览0 收藏

最近在用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的属性也不可以)

查看回复

回复 (18)

W
wenbob#1·13 年前

先 delete obj_content[i]

B
brighthas#2·13 年前

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


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

M
myy#3·13 年前

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

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

B
brighthas#4·13 年前
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

J
JacksonTian#5·13 年前

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

Z
zengwenbing#6·13 年前

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

X
xuyufei#7·13 年前
引用 myyvar obj content=null;//把变量设置为空也不能释放 大哥,错了,用了var就是重新定义了另一个变量,不是原来的那个了。。。

不好意思,我第一次使用这个论坛,然后发现发布了之后不能修改编辑,我也知道写错了,但是没办法修改,其实你把那个 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);

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

X
xuyufei#8·13 年前

不可以,不起作用

X
xuyufei#9·13 年前
引用 wenbob先 delete obj content[i]

不可以,不起作用啊

X
xuyufei#10·13 年前
引用 JacksonTian可以把代码格式弄好点再问问题么

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

B
brighthas#13·13 年前

you can't control , CG auto.


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

I
icetoggle#14·13 年前

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;//把变量设置为空也不能释放
})

}

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

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

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

B
brighthas#15·13 年前
引用 icetogglefunction func1(c) { c(); } function func2() { func1( function(){ var obj content={};//变量在回调函数内部 ...

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

X
xuyufei#16·13 年前
引用 icetogglefunction func1(c) { c(); } function func2() { func1( function(){ var obj content={};//变量在回调函数内部 ...

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

X
xuyufei#17·13 年前
引用 icetogglefunction func1(c) { c(); } function func2() { func1( function(){ var obj content={};//变量在回调函数内部 ...

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

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

} ,1000);

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

B
brighthas#18·13 年前
引用 icetogglefunction func1(c) { c(); } function func2() { func1( function(){ var obj content={};//变量在回调函数内部 ...

@xuyufei yes , use old memory.

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

参与回复
登录后即可参与回复。登录