2012-12-10 13 views
10
variabili

mio Node.js progetto che soffrono di memoria che perde, ho già impostato su NULL in chiusura, voglio dire, so che il codice come questo:identificare perdita di memoria di chiusura con memwatch nodi

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

Will causare perdite di memoria, quindi aggiungo del codice per impostare queste variabili su null;

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

Ma ho ancora avuto perdite, quindi cerco di usare memwatch-node di capire cosa c'è di sbagliato con il mio codice.

E il risultato mostra che closure causando la perdita, ma non specificato abbastanza a bersaglio.

Ho il JSON come questo

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

E mi chiedo se avrei potuto ottenere i dettagli più specifici su cui chiusura è fuoriuscita.

Ho assegnato nome per tutte le chiusure, ma ancora non funziona.

+0

Questo è un oggetto letterale. Di per sé, non ha nulla a che fare con la "chiusura", oltre ad avere una delle sue proprietà impostate sulla stringa "Chiusura", che potrebbe anche essere "Datsun Cherry del 1982". –

+0

Quindi quale tipo di oggetto lo farebbe? Non ho impostato "chiusura" da solo. – bxshi

+0

Sì, sono imbarazzato, posso vedere meglio di cosa si tratta adesso. Sono stato nella documentazione di memwatch ma non riesco a trovare la prova di una sezione 'what: 'Closure'' in un rapporto diff. [Questo] (https://hacks.mozilla.org/2012/11/tracking-down-memory-leaks-in-node-js-a-node-js-holiday-season/) indica che le perdite di chiusura sono segnalate ma non in quel modo. È un po 'confuso. –

risposta

2

Non è possibile ottenere informazioni più specifiche su quale chiusura. memwatch ottiene un dump dell'heap v8 e quindi ne rileva le differenze e segnala le perdite se, dopo 5 successivi eventi di garbage collection, il conteggio dei tipi di oggetto ha continuato a crescere.

Inoltre, credo che si sono confusi su ciò che le chiusure sono. The MDN page on closures fornisce una buona descrizione. Una chiusura non è una variabile, ma un ambito che consente alle funzioni di conservare i riferimenti e continuare a lavorare se utilizzati in una parte del codice in cui tali riferimenti variabili non sarebbero altrimenti disponibili.

Se si passa funzioni attorno mantenere un riferimento a tale funzione, è la chiusura potrebbe fare riferimento altri dispositivi di chiusura. Quindi, è possibile che tu abbia una singola chiusura che potrebbe avere molto in esso.

fare questo: disabilitare parti del codice fino a quando si ferma a causa memwatch. Quindi, guarda quel codice. Se sei ancora confuso, pubblica più dettagli in questa domanda.