Ich habe eine JavaScript-Speicherbereinigung/Speicherleck Frage. Ich verwende Chrome 28.0.1500.71 unter OS X 10.8.4.JavaScript Closure Memory Leak
Der folgende Code wird niemals den Speicherplatz freigeben, der von me
gehalten wurde, und ich weiß nicht warum.
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 scheint das Objekt durch den Ausdruck new MyClass()
(das Objekt, das me
zeigten auf, bevor null
gesetzt wird) geschaffen zu halten im Speicher, da es durch self
im Aufruf von me.do_thing()
verwiesen wird. Allerdings hätte ich gedacht, der Anruf an destroy()
, die me.do_thing
Unsets wegwerfen würde die Variablen im Rahmen des Konstruktors wegwerfen (self
in der new MyClass()
Anruf).
Ich habe auch versucht, Underscore.JS _.bind
Funktion zu verwenden, aber laufen in das gleiche ungelöste Problem wie hier beschrieben: Instances referenced by 'bound_this' only are not garbage collected.
Bitte seien Sie präzise und unterscheiden Sie zwischen der globalen Variable 'me' und dem' MyClass' Objekt. Die Variable wird sicherlich im Speicher bleiben, aber das ist kein Problem (und wenn es ist, können Sie es aus 'Fenster 'entfernen, siehe Simonleung's Antwort). Zeigt Chrome an, dass das 'MyClass'-Objekt noch am Leben ist? – delnan
Messepunkt; es ist das 'MyClass'-Objekt, auf das * von mir verwiesen wurde, das niemals freigegeben wird. Ich habe den Wortlaut meiner Frage aktualisiert, um dies klarer zu machen. – soney
Sieht so aus, als gäbe es einen Fehler in V8, ich öffnete ein Problem dagegen: https://code.google.com/p/v8/issues/detail?id=2791 –