2011-11-04 10 views
9

Sono consapevole che non è facile gestire correttamente la memoria all'interno di un'applicazione con molti elementi dell'interfaccia utente e completamente basata su Ajax (nella mia app le pagine non vengono mai ricaricate). Ma mi piacerebbe capire il seguente comportamento:jQuery.remove(), separa elementi DOM, ma posso ancora accedere agli elementi dal codice. Come evitare le perdite?

Ho un elemento radice a cui un elemento figlio singolo alla volta deve essere collegato (pensarlo come l'elemento principale è il contenitore dell'app e le pagine singole di child). Ogni volta che passo da un contenuto figlio all'altro, rimuovo il contenuto precedente con jQuery.remove(), ma vedo che il contenuto è in realtà staccato dal DOM ma rimane in memoria.

  1. radice e due contenuti figlio (child1 e child2)
  2. da child1 posso passare a child2, chiedendo il mio manager app per rimuovere child1 prima di fissare child2
  3. child2 viene attaccato (posso vederlo), ma posso ancora usare gli elementi child1 dal codice che gestisce child1

codice child1 (che detiene i riferimenti a child1 DOM):

function testaccess(){ 
    load_and_remove(child2); 
    var child1DOM = get_this_dom(); 
} 

child1DOM è ancora lì e posso manipolarlo come se fosse ancora collegato al DOM.

Ok, suppongo che jQuery.remove() e il GC non saranno in grado di rilasciare memoria finché non avrò il codice che accederà ad esso, ma anche se non chiamo get_this_dom(), anche dopo essere usciti da testaccess(), Vedo che la memoria FF non diminuisce ...

Mi chiedo come far rilasciare a GC tutta la memoria, quando esco da child1.

+0

un rapido sguardo a destra "correlate" domande link rivelato un caso simile -> http://stackoverflow.com/q/768621/104380 – vsync

risposta

6

Non verrà rimosso dal DOM finché non verranno rilasciati tutti i riferimenti.

Si dovrebbe tentare di rimuovere tutti i riferimenti circolari tra il DOM JS e il rendering del DOM - entrambi dispongono di garbage collector separati e lavorano separatamente. Quindi perché il marcatore e spazzino JS garbage collector non cattura quelli.

Si potrebbe provare a rielaborare il codice per rompere il riferimento circolare:

var mything = something(); 
mything = null; 

Qui ci sono un paio di articoli che potrebbe aiutare:

http://msdn.microsoft.com/en-us/library/Bb250448

http://www.javascriptkit.com/javatutors/closuresleak/index.shtml

http://javascript.info/tutorial/memory-leaks

Sono abbastanza sicuro che ne potreste trovare ancora un po 'più rapidamente riguardo a questo.

Inoltre, è possibile provare lo .empty() per rilasciare tutti i nodi figlio ma chiama .remove() per fare un po 'di lavoro.

Si noti che alcuni di questi problemi sono stati risolti nelle versioni più recenti di jQuery, ad esempio 1.5 è meglio di 1.4.

Un altro post su SO su questo: jQuery memory leak with DOM removal

+1

Grazie per le vostre risposte . Cercherò di ridefinire alcuni punti del mio codice, anche se sono già alcune migliaia di righe :( (Satckoverflow non invia risposte alla mia email, quindi mi scuso per non aver risposto in modo tempestivo ... pensavo che nessuno rispondesse me!) – giohappy

Problemi correlati