[英]JavaScript Closure Memory Leak
我有一個Javascript垃圾收集/內存泄漏問題。 我在OS X 10.8.4上使用Chrome 28.0.1500.71。
以下代碼永遠不會釋放me
所擁有的空間,而且我對其原因一無所知。
var MyClass = function() {
this.x = 1;
var self = this;
this.do_thing = function() {
self.x++;
};
};
MyClass.prototype.destroy = function() {
delete this.do_thing;
};
var me = new MyClass();
me.do_thing();
me.destroy();
me = null;
// the MyClass object formerly known as 'me' is still allocated here
// (as evidenced by Chrome's heap profiler)
Chrome似乎在內存中保留由表達式new MyClass()
( me
在設置為null
之前指向的對象new MyClass()
創建的對象,因為在調用me.do_thing()
它被self
引用。 但是,我本以為調用destroy()
, me.do_thing
會拋棄構造函數范圍內的變量(在new MyClass()
調用中self
)。
我也嘗試過使用_.bind
的_.bind
函數,但遇到了這里描述的同樣未解決的問題: 'bound_this'引用的實例不是垃圾收集的 。
我不知道為什么它不是垃圾收集,但是將destroy方法添加到實例而不是原型並將self
設置為null,顯然會起作用:
var MyClass = function() {
this.x = 1;
var self = this;
this.do_thing = function() {
self.x++;
};
this.destroy = function() {
delete this.do_thing;
self = null;
};
};
var me = new MyClass();
me.do_thing();
me.destroy();
me = null;
即使你將它設置為null,我仍然是window對象的屬性。 因此,“我”仍然在記憶中。
我認為這可能會有所幫助:
window.me = new MyClass();
me.do_thing();
delete window.me;
MyClass是一個全局變量。 它也是瀏覽器環境中窗口對象的屬性。 它不是垃圾,所以不會被收集。
看起來像個bug。 順便說一句me.destroy()是沒有必要的。 它應該在沒有它的情況下刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.