2009-10-05 16 views
22

So che Javascript ha un garbage collector. Pertanto, utilizzando elimina rimuovi solo un riferimento all'oggetto e quando non vi è più alcun riferimento a questo oggetto, viene eliminato dal GC.Problemi di gestione della memoria Javascript?

Javascript è difficile, con le chiusure, lo spazio dei nomi fuzzy e l'ereditarietà del prototipo, non è sempre ovvio sapere quando o perché.

Sto codificando un progetto Javascript abbastanza grande e vorrei evitare perdite di memoria, limitando l'utilizzo della memoria globale. Non sono affatto nella fase di ottimizzazione (facciamo prima le cose :-)), ma sarebbe bello conoscere le buone pratiche per la gestione della memoria per evitare di scrivere codice scadente.

  • Quindi quando dovrei usare eliminare?
  • Quali sono le trap che dovrei evitare, usando gli oggetti?
  • Alcune cose da sapere sulle chiusure?
  • Alcune buone pratiche da evidenziare?
+0

C'è forse un errore di battitura in cui si ha "a sapere quando ** ora ** o perché?"? Non riesco a analizzare questo pezzetto di inglese ... – hippietrail

+0

Non riesco a capirmi da solo. Forse ero ubriaco o mi sono appena svegliato quando l'ho scritto. O entrambi. Ignora semplicemente. –

risposta

3

Penso che memorizzando i dati sui nodi DOM sia possibile creare facilmente riferimenti circolari che non tutti i browser possono gestire. Per esempio:

this.element = document.getElementById('something'); 
this.element.attachedObject = this; 
5
  • In IE, almeno nelle versioni precedenti, un elemento DOM è stata mantenuta in memoria dopo è stato rimosso utilizzando removeChild se avesse un listener di evento associato. L'unico modo per rimuoverlo dalla memoria era quello di staccare l'evento prima di rimuoverlo dal DOM.
  • Fintanto che non crei e rimuovi elementi spesso, non devi preoccuparti di questo. Se crei molti elementi all'avvio dell'applicazione, ma non crei nuovi oggetti, non preoccuparti troppo delle perdite di memoria.
10

Dalla mia esperienza, i Garbage Collector sono ben/mal implementati a seconda del browser. L'applicazione di buone pratiche di programmazione orientate agli oggetti è un buon inizio.

Il mio unico consiglio: non creano perdite di memoria collegando DOM & oggetti JavaScript (i riferimenti circolari, che non verrà cancellata dal DOM e JS GC). Questi errori mangeranno molta più memoria di qualsiasi oggetto tu installi nella tua applicazione.

Ulteriori dettagli sulle perdite di memoria DOM/JS. http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

+1

D'accordo sul collegamento di DOM con oggetti js è il problema più grande di cui sono a conoscenza. Penso che la maggior parte dei browser abbia un heap di memoria diverso per gli oggetti DOM e js, quindi fare connessioni tra loro spesso causa perdite di memoria. Un altro link utile: http://www.ibm.com/developerworks/web/library/wa-memleak/ – Vojta