Mam pytanie dotyczące wycieku pamięci w pamięci JavaScript. Używam Chrome 28.0.1500.71 na OS X 10.8.4.Wyciek z powodu zamknięcia zapory w języku JavaScript
Poniższy kod nigdy nie zwalnia miejsca, które było w posiadaniu me
i nie mam pojęcia, dlaczego.
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 wydaje się utrzymanie obiektu utworzonego przez ekspresję new MyClass()
(obiektu, który me
wskazał przed ustawiony null
) w pamięci, ponieważ odwołuje się self
w zaproszeniu do me.do_thing()
. Jednak pomyślałem, że wywołanie destroy()
, które wyłączy me.do_thing
, wyrzuci zmienne w zakresie konstruktora (self
w wywołaniu new MyClass()
).
Próbowałem również użyć funkcji Underscore.JS w _.bind
, ale uruchomiono ten sam nierozwiązany problem opisany tutaj: Instances referenced by 'bound_this' only are not garbage collected.
Proszę dokładnie rozróżnić "zmienną globalną" ja' "i" obiekt 'MyClass'". Zmienna na pewno pozostanie w pamięci, ale to nie jest problem (a jeśli tak, to możesz ją usunąć z 'okna', zobacz odpowiedź simonleunga). Czy Chrome wskazuje, że obiekt 'MyClass' nadal żyje? – delnan
Fair point; jest to obiekt 'MyClass', do którego * odwoływał się * me, który nigdy nie zostaje zwolniony. Zaktualizowałem treść mojego pytania, aby było to jaśniejsze. – soney
Wygląda na to, że jest błąd w V8, otworzyłem problem z tym: https://code.google.com/p/v8/issues/detail?id=2791 –