我敢肯定這已被問過,但我沒有找到它。Javascript關閉內存使用與對象成員
什麼是下面的示例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,閉包的垃圾回收是[完成每個變量](http://stackoverflow.com/questions/5326300/garbage-collection-with-node-js),但不是每個對象的屬性。它需要對該對象的使用進行大量的假設。 – Bergi