最近在用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的属性也不可以)
delete ?
先 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去掉也不可以
可以等了好几个小时内存也不能释放
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