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?
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