2012-12-10 3 views
10

Mein Node.js Projekt leidet Speicher undicht identifizieren, habe ich bereits gesetzt Variablen auf null in Schließung, ich meine, ich Code wie folgt wissen:Speicherverlust des Verschlusses mit memwatch-Knoten

var a = 0; 
var b = 1; 
var c = 0; 
example_func(c, func(){ 
    console.log(b); 
}); 

verursacht Speicherlecks, also füge ich Code hinzu, um diese Variablen auf null zu setzen;

var a = 0; 
var b = 1; 
var c = 0; 
example_func(c, func(){ 
    console.log(b); 
    a = null; 
    b = null; 
    c = null; 
}); 

Aber ich habe immer noch undicht, so versuche ich memwatch-node zu verwenden, um herauszufinden, was mit meinem Code falsch ist.

Und das Ergebnis zeigt, dass closure verursacht das Leck, aber nicht ausreichend angegeben.

Ich habe die JSON wie diese

{ what: 'Closure', 
    '+': 12521, 
    size: '520.52 kb', 
    '-': 5118, 
    size_bytes: 533016 }, 

bekam Und ich frage mich, ob ich mehr spezifische Details bekommen könnte, um die undicht Schließung.

Ich habe Namen für alle Schließungen vergeben, aber immer noch nicht funktionieren.

+0

Das ist ein Objekt Literal. An sich hat es nichts mit "closure" zu tun, abgesehen davon, dass eine seiner Eigenschaften auf die Zeichenfolge "Closure" gesetzt ist, was auch "1982 Datsun Cherry" sein könnte. –

+0

Also welche Art von Objekt würde das tun? Ich setze keine "Schließung" von mir selbst. – bxshi

+0

Ja, mir ist peinlich, ich kann besser sehen, worum es bei deiner Frage geht. Ich war in der Memwatch-Dokumentation, kann aber keine Beweise für einen 'Was: 'Closure'-Abschnitt in einem Diff-Bericht finden. [Dies] (https://hacks.mozilla.org/2012/11/tracking-down-memory-leaks-in-node-js-a-node-js-holiday-season/) zeigt an, dass Verschlusslecks gemeldet werden, aber nicht auf diese Weise. Es ist etwas verwirrend. –

Antwort

2

Sie können nicht genauer bestimmen, welche Schließung. memwatch ruft einen Speicherauszug des V8-Heapspeichers ab und nimmt dann Unterschiede davon an und meldet Lecks, wenn nach 5 aufeinander folgenden Speicherbereinigungsereignissen die Anzahl der Objekttypen weiter anwächst.

Auch ich glaube, Sie sind verwirrt, was Verschlüsse sind. The MDN page on closures gibt eine gute Beschreibung. Ein Abschluss ist keine Variable, sondern ein Bereich, der es Funktionen ermöglicht, Referenzen beizubehalten und weiter zu arbeiten, wenn sie in einem Teil des Codes verwendet werden, in dem diese Variablenreferenzen andernfalls nicht verfügbar wären.

Wenn Sie Funktionen übergeben, behalten Sie einen Verweis auf diese Funktion, ihre Schließung könnte auf andere Schließungen verweisen. Also, es ist möglich, dass Sie eine einzige Schließung haben, die viel drin haben könnte.

Tun Sie dies: Deaktivieren Sie Teile Ihres Codes, bis Memwatch aufhört, sich zu beschweren. Dann schau dir diesen Code an. Wenn Sie immer noch verwirrt sind, posten Sie mehr Details in dieser Frage.

Verwandte Themen