JS垃圾收集:对象属性的引用导致整个对象保留在内存中?

时间:2017-12-12 05:23:00

标签: javascript ajax object memory-leaks garbage-collection

这个答案似乎有关,但我需要更具体的信息:Garbage collection: object properties

假设我有一个全局对象:

var myObj  {
  'some prop' : null
};

和返回结果的Ajax调用(为了耐心而简化):

result = {
  prop1 : someObj,
  prop2 : otherObj
}

考虑这个操作:

ajax.get('some url', function(result){
  myObj['some prop'] = results.prop2
});

由于对象是通过引用分配的,而不是像原语一样被复制,我担心整个results对象将保留在内存中,因为我的全局对象myObj现在引用了它的一个属性( prop2)。

我想如果我运行太多的Ajax请求,这可能会成为数据泄漏的来源。

我不需要所有结果,只需要一些属性。我是否应该从结果或克隆结果属性中删除不需要的属性而不是分配?

我想知道浏览器垃圾收集器是否足够智能来处理这个问题,和/或这不是一个真正的问题。

1 个答案:

答案 0 :(得分:2)

因为function参数表示它的局部变量,所以在执行超出Ajax函数的范围之后,result对象将变得无效并且可以被释放。

但是有一些例外,比如循环引用:

function f() {
  var o = {};
  var o2 = {};
  o.a = o2; // o references o2
  o2.a = o; // o2 references o

  return 'azerty';
}

由于标记和扫描算法,上述代码会将oo2释放到垃圾收集,除非您在函数的外部范围内声明其中一个并且它可以从全局范围到达,因此垃圾收集器可以访问它(因此被视为需要的对象,因此不会从内存中删除)。

SOURCE