最近在用node做游戏服务器的开发,发现了闭包导致的内存泄漏问题。
举个例子
function aa(c)
{
c();
}
function bb()
{
aa(function(){
var obj_content={};//变量在回调函数内部
for(var i=0;i<20000000;i++)
{
obj_content[i]=i;//添加对象内容
}
console.log(obj_content[1]);
obj_content=null;//把变量设置为空也不能释放
})
}
bb();
setInterval(function(){console.log()},1000);
然后再Linux下运行,发现内存一直被占用,不能释放。
obj_content=null;这个代码已经把变量置为null了,但是内存为什么一直不能释放,等一两个小时还是占很大的内存,用delete删除对象属性也不可以。请问各位大侠,如何释放内存?????急急急
如果是按照你现在这个函数的话,JS的垃圾回收机制会回收内存滴。obj_content这个对象已经成为孤岛了… 建议你用数组对象试试… var arr = new Array(); function aa© {
c();
} function OBJ(){ } function bb() {
aa(function(){ //var obj_content={};//变量在回调函数内部 arr.push(new OBJ()); for(var i=0;i<20000000;i++) { obj_content[i]=i;//添加对象内容 } console.log(obj_content[1]); //obj_content=null;//把变量设置为空也不能释放
arr.splice(0,1);//假如第1个 删掉第1个
}) } bb();
setInterval(function(){console.log()},1000);
这个问题我已经知道答案了,node的GC是当开辟新内存地址的时候,才会去考虑回收以前的垃圾变量,这个段代码并没有开辟新内存,如果把setInterval(function(){console.log()},1000);改成setInterval(function(){
var obj1={};
for(var i=1;i<100;i++){
obj1[i]=i;
}},1000);内存就能回收额