5

Sono in procinto di profilare una libreria javascript che ho scritto, cercando le perdite di memoria. La libreria fornisce un'API e un servizio per un back-end. Non fa alcuna manipolazione html o dom. Non carica alcuna risorsa (immagini, ecc.). L'unica cosa che fa è fare richieste xhr (usando jquery), incluso un lungo sondaggio, e passa e riceve dati da e verso l'interfaccia utente tramite eventi (usando un bus di eventi Backbone).Crescita inspiegabile nella memoria privata del cromo

Ho testato questa libreria eseguendola durante la notte per 16 ore. La pagina che lo carica non fa altro che caricare la libreria e invia una richiesta di accesso per avviare il servizio. Nel corso del test non sono state apportate modifiche a dom, css o altri dom.

Tutto ciò che è accaduto nel corso del test è stato la libreria ha inviato un heartbeat (richiesta xhr) al server ogni 15 secondi e ha ricevuto un heartbeat tramite il sondaggio lungo ogni 30 secondi.

Ho eseguito il test con il task manager di Chrome aperto e con il debugger di Chrome aperto, per forzare i GC dalla timeline.

All'inizio dei test, dopo aver costretto un GC iniziale - queste erano le statistiche dal task manager Chrome: Memoria - 11.7mb

Javascript memoria - 6.9 mb/2.6MB vivo

memoria condivisa - 21.4 mb

memoria privata 19MB

Dopo 16 ore ho forzato un GC - queste erano le nuove statistiche: memoria - 53.8mb

012.351.641.061.

Javascript memoria - 6.9 mb/2.8MB vivo

Memoria condivisa - 21.7 mb

memoria privata 60.9mb

Come si può vedere l'heap JS cresciuto solo 200k.

La memoria privata è cresciuta di 42 mb!

Qualcuno può fornire spiegazioni su cosa ha causato la crescita della memoria privata? Avere il debugger chrome aperto causa o influisce sulla crescita della memoria?

Un altro pensiero che ho è che forzare il GC dal debugger della timeline recupera solo la memoria dall'heap JS, quindi non è stata recuperata altra memoria. Pertanto, questa potrebbe non essere una "perdita" di per sé, in quanto potrebbe eventualmente essere rilevata, anche se non sono sicuro di come confermare ciò. Soprattutto senza sapere cosa rappresenta questa memoria.

Infine, ho letto che i risultati xhr sono anche memorizzati nella memoria privata. Qualcuno sa se questo è vero? Se è così, l'app ha eseguito circa 5700 richieste xhr in questo lasso di tempo. Se la maggior parte dei 42mb era dovuta a questo, ciò significherebbe circa 7k allocati - il che sembra elevato, considerando che i carichi utili erano molto piccoli. Se questo è il caso; quando verrà rilasciata questa memoria, c'è qualcosa che posso fare per far sì che venga rilasciata, e l'apertura del debugger di Chrome potrebbe avere impatto su questo?

+0

chrome si è bloccato su di me da troppe accumulazioni console.log(). puoi vedere le intestazioni e gli orari di tutte quelle connessioni, quindi 7kb suona bene. eseguirlo durante la notte senza gli strumenti in esecuzione e vedere se il problema persiste. Usa il task manager chromes per guardare ram invece di inspector. – dandavis

risposta

4

Non sono riuscito a trovare informazioni su quando e cosa esattamente va alla memoria privata rispetto alla memoria javascript. Tuttavia, posso rispondere a questa domanda: "l'apertura del debugger di Chrome avrà un impatto su questo" ... SÌ.

Avendo gli strumenti di sviluppo aperti, il browser raccoglie/conserva/visualizza molte più informazioni su ogni XHR che viene creato. Questi dati non vengono raccolti/conservati quando gli strumenti di sviluppo sono chiusi (come molti sanno dal momento che a volte è dannatamente fastidioso quando si aprono gli strumenti di sviluppo fino a tardi e si è persa quella richiesta che ti interessava).

È possibile aprire gli strumenti di sviluppo, attivare il GC, quindi chiudere gli strumenti di sviluppo, aprendoli di nuovo solo per attivare il GC quando si desidera prendere la metrica. Inoltre è possibile utilizzare questo chrome di sucker: // reindirizzamento della memoria/per tenere traccia della crescita senza aprire gli strumenti di sviluppo.

+0

Come si attiva la garbage collection tramite gli strumenti dev? – Luke

+1

@Luke - "In Timeline può essere molto conveniente forzare un GC facendo clic sul pulsante del cestino (Garbage)()." - https://developer.chrome.com/devtools/docs/javascript-memory-profiling –

Problemi correlati