2012-03-24 13 views
13

Sono abbastanza sicuro di avere perdite di memoria utilizzando KO versione 2.0. Ho una matrice osservabile che viene popolata con il risultato di una chiamata AJAX. Questa raccolta è associata ai dati con una per ciascuno in un contenitore DIV. Ogni oggetto nell'array ha un singolo valore osservabile associato a una casella di controllo. Ho esaminato l'heap utilizzando Chrome e la mia conclusione è la seguente:KnockoutJS Memory Leak

Se la chiamata AJAX restituisce 3 elementi, vengono visualizzati correttamente sul DOM. Se faccio uno snapshot dell'heap a questo punto, ci sono tre oggetti SearchResult. Se faccio scattare di nuovo la chiamata AJAX e restituisce 5 elementi, tutti e 5 sono correttamente resi al DOM. Tuttavia, se faccio uno snapshot dell'heap in Chrome e li confronto, ci sono 8 elementi elencati come ancora presenti nell'heap, tutti elencati come "aggiunti" e nessuno elencato come "cancellato". Il display DOM è sempre corretto, ma l'uso della memoria continua a salire e arrampicarsi perché i vecchi risultati di ricerca non vengono mai rilasciati.

Qualcuno può aiutarmi o darmi dei suggerimenti per diagnosticare la perdita di memoria?

UPDATE

ho creato un jsFiddle per mostrare l'essenza di quello che sto facendo. Ho messo a nudo TUTTO ma la funzionalità di base e posso ancora duplicare la perdita di memoria quando si esegue sul mio computer locale. Ovviamente il codice non funzionerà come è pubblicato perché ha bisogno di colpire il mio server locale per eseguire la ricerca.

UPDATE 2

ho tirato la nuova versione 2.1.0.0 Beta e la perdita scomparsi. Non sono un grande fan dell'uso della versione beta di cose o della classica correzione "solo aggiornamento alla nuova versione". Sono ancora molto interessato a sapere cosa è cambiato o cosa stavo facendo male che stava creando la fuga.

+2

Ha effettivamente andare avanti fino a quando non esaurisce la memoria? I motori JS non raccoglieranno i dati immediatamente, quindi quello che vedrai potrebbe essere solo il motore che non sta facendo il GC in quanto ha ancora molta memoria. –

+0

Ho visto il mio sito che utilizza fino a 450 MB. Il motore non consumerebbe sempre più memoria fino a quando non vi è stato alcun margine di allocazione determinato dal sistema operativo? Ciò non significherebbe che il sistema operativo lascerebbe che il browser continui a utilizzare sempre più memoria fino a quando il computer non si blocca? Come posso testare per vedere se esaurisce la memoria? – arb

+0

Il comportamento è difficile da prevedere. Potresti provare a ripetere la chiamata ajax più volte e vedere se continua a utilizzare sempre più memoria. Potrebbe aiutare se si tenta di ridurre il codice in un piccolo caso di test che è possibile inserire nella domanda e se si rivela essere una perdita, dovrebbe probabilmente essere inviato anche a sviluppatori KO. –

risposta

10

Non stai facendo nulla di sbagliato, sembra che ko.cleanNode stia ignorando i collegamenti foreach e non smaltisca correttamente gli oggetti obsoleti all'interno dello observableArray aggiornato.

https://github.com/SteveSanderson/knockout/issues/271

Questo è stato risolto in 2.1.0beta

+3

Il [problema a cui fai riferimento] (https://github.com/SteveSanderson/ knockout/issues/271) è stato chiuso perché il reporter stava usando il Knockout sbagliato. Non si dovrebbe chiamare applyBindings() più di una volta sugli stessi nodi DOM. – GregT