最近在用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的属性也不可以)
you can’t control . CG smart recovery of memory.
签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3
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);
就是这段完整的代码,知道怎么释放掉内存吗,发现内存一直被占用。
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