【发布时间】:2017-02-26 21:59:37
【问题描述】:
我确定以前有人问过这个问题,但我没有找到。
以下示例 Javascript 闭包的内存使用情况是什么:
var f = (function(sz){
var obj = {
x : sz,
y : new Array(sz),
};
var _x = obj.x;
return function() {
return obj.x;
};
})(1000000);
应该保留多少obj 用于最终的关闭?将所有obj 保存在内存中,还是只保存obj.x?
我应该说我尝试(像新手一样)在 Google Chrome 中使用堆分析器。在关闭之前,总堆大小为 5.3MB。关闭后,当我将 obj.y 数组大小 (sz) 设置为 1,000,000 时,总堆大小为 13.2MB,f 保留 8MB。这表明obj.y 仍保留在内存中。当我将sz 更改为 10,000,000 时,堆大小为 81.9MB,f 保持健康的 80MB。与剩余的obj.y 一致。但是当我使用 100,000,000 的sz 时,配置文件显示的堆大小仅为 5.6M,而f 保留了 0.5MB。这告诉我obj.y 与垃圾一起被取出。并且在任何时候,f() 都会返回正确的值,因此可以推测,闭包按预期工作。
所以问题仍然存在,上面的闭包在内存中保存了什么?显然,我知道它可以是什么,但它应该是什么?
【问题讨论】:
-
有一点需要注意,
new Array(n)不会(必然)占用太多内存,因为数组是用“空槽”创建的 - 试试new Array(sz).fill('')看看区别 -
Afaik,闭包的垃圾收集是done per variable,但不是每个对象属性。它需要对对象的使用做出大量假设。
标签: javascript object closures