Forzare la garbage collection in Google Chrome

Stiamo sviluppando un’applicazione web a pagina singola con ZK che comunica costantemente con il server e aggiorna le parti dei suoi schermi. L’aggiornamento può essere frequente quanto 1s. Durante questi aggiornamenti, i riferimenti a grandi quantità di oggetti JS vengono persi e questi oggetti devono essere eliminati da Garbage Collector.

Per quanto abbiamo capito, Chrome esegue il suo garbage collector solo sulle tabs inattive. Questo è un problema per noi, perché la scheda dell’app è di solito triggers e quasi mai aggiornata, quindi gli oggetti JS non vengono mai raccolti. Se lasciato attivo per un tempo sufficiente, la scheda alla fine si blocca (messaggio Aww Snap ).

Dobbiamo avviare manualmente la raccolta dei dati inutili. Finora abbiamo provato a eseguire Chrome con --js-flags="--expose-gc" ed eseguendo gc() , ma genera un’eccezione:

 ReferenceError: gc is not defined 

Questo non succede su Firefox – l’utilizzo della memoria è più o meno costante.

Forzare l’aggiornamento della pagina non è un’opzione.

    Saremo grati per ogni e tutti i suggerimenti.

    EDIT : abbiamo provato a eseguire window.gc() e gc() su entrambe le versioni di Chrome 23.0.1271.97 m 25.0.1364.2 dev-m

    Puoi recuperare il codice di Chrome Dev Tools, modificarlo in modo che ProfilerAgent.collectGarbage(); viene chiamato ogni tanto (si tratta di un codice che viene chiamato quando si fa clic sul pulsante ‘Collect Garbage’ nel pannello Timeline) ed esegui Chrome con la tua versione di DevTools usando il flag --debug-devtools-frontend .

    Tuttavia, questa soluzione è abbastanza estrema, provalo solo quando sei davvero disperato. Fino ad allora, propongo di profilare la tua domanda e verificare perché v8 decide di non pulire la spazzatura (o non può pulire la spazzatura). Il pannello Timeline di DevTools ti aiuterà in questo. Iniziare controllando se il pulsante ‘Collect Garbage’ nella parte inferiore di questo pannello faccia davvero il suo lavoro, altrimenti – probabilmente hai una perdita di memoria (almeno, secondo la v8). In tal caso, prova a trovare il leak-finder-per-javascript .

    [ EDIT ] Ho rimosso le informazioni sull’estensione chrome, in quanto risulta che gc() può essere chiamato dal codice della pagina Web quando viene utilizzato --js-flags="--expose-gc" . Almeno sul mio 23.0.1271.64.

    In Strumenti per sviluppatori di Chrome hai la sezione “Cronologia”, da circa Chrome 53. hai il pulsante che appare come Garbage Can. cliccandoci sopra e costringendo il garbage collector a correre. inserisci la descrizione dell'immagine qui

    Ho trovato una soluzione. Apparentemente Chrome perde i nodes DOM, almeno nella versione attuale (26.0.1410.65 adesso)

    Ho registrato la cronologia degli strumenti di sviluppo nella mia app e ha mostrato che il conteggio degli Event Listers saliva e scendeva ritmicamente insieme ai contenuti della schermata dell’app, ma il conteggio dei nodes DOM era in costante aumento nel tempo, fino a quando la scheda non si arrestava.

    Ho provato l’ultimo Chrome Canary (28.0.1500.3) e sembra che abbiano risolto il problema. Il grafico del conteggio dei nodes DOM ora segue lo stesso modello ritmico degli ascoltatori di eventi.

    La cosa che mi prende è … perché Gmail non si schianta mai? Di solito tengo una scheda aperta per settimane alla volta …