2012-07-01 12 views
8

L'ho trovato su tutti i browser testati - IE, Firefox, Chrome e Safari su Window sand Safari su Apple.aggiornamento del browser non effettua la garbage collection

Presumibilmente, un aggiornamento del browser, pulsante indietro o collegamento in avanti dovrebbe scaricare i nodi del browser e le variabili e gli oggetti javascript, ecc. Questo sembra non essere il caso di WebGL. L'ho notato per la prima volta durante lo sviluppo di un'applicazione WebGL complessa che richiede da 100 MB a 200 MB di memoria. Durante lo sviluppo, devo fare un sacco di aggiornamenti e il mio computer inizierà a rallentare e congelarsi dopo 5-10 aggiornamenti.

Dopo alcune ricerche ho capito che questo non dovrebbe essere. La soluzione accettata al di fuori di una perdita di memoria è quella di aggiornare la pagina che deve rilasciare tutti gli oggetti e le variabili javascript e dom nodes. Ma date un'occhiata alle seguenti immagini:

Quindi qual è l'affare qui? Nelle piccole app non si nota, ma per le applicazioni WebGL di grandi dimensioni come la mia (orbitingeden.com) questo è un problema reale e i miei utenti penseranno che il software sia ancora più ricco di risorse di quanto non sia in realtà. L'immagine seguente mostra questi rinfresca divorando tutta la mia memoria disponibile, quindi la raccolta dei rifiuti non funziona e/o JS e DOM oggetti non vengono rilasciate:

http://orbitingeden.com/images/big_memory_after.png

Qualcuno sa di un trucco per forzare la browser per fare un vero dump di memoria? Perché tutta la documentazione è sbagliata?

+2

https://bugs.webkit.org/show_bug.cgi?id=76225 – gman

+0

@gman: se rispondi alla domanda, ti darò il merito. Sintesi: WebGL utilizza un contesto che viene preservato dal dominio e dalla scheda, irrilevante della pagina specifica (aggiornamento). Di conseguenza, qualsiasi memoria allocata al rendering WebGL non viene rilasciata per la garbage collection finché l'utente non si allontana dal dominio di base o chiude la scheda. Una possibile soluzione sarebbe quella di aggiungere un pulsante di uscita all'applicazione che esegue un reindirizzamento rapido a un nuovo dominio che reindirizza il terzino destro. –

+0

Il bug verrà risolto in qualsiasi momento ora, quindi spero che non ci sarà bisogno di soluzioni alternative presto. C'è in realtà un test per questo nei test di conformità Webgl (https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/tests/conformance/context/context-creation-and-destruction. html) – gman

risposta

2

Uno dei punti con garbage collection è che gli oggetti sono non puliti immediatamente non vengono utilizzati. Il garbage collector può determinare da solo quando è più conveniente fare raccolte.

È normale che un sistema di raccolta dati inutili tp lasci alcuni oggetti inutilizzati nell'heap, purché ci sia un sacco di memoria da utilizzare. Un computer non esegue più velocemente dall'avere molta memoria inutilizzata.

+0

Questo dovrebbe essere vero durante la sessione di pagina. Tuttavia, la regola generale è che l'aggiornamento di una pagina dovrebbe procedere come segue: rimuovere tutti i nodi, orfano tutte le variabili e quindi forzare una garbage collection che dovrebbe raccogliere tutti gli oggetti e le variabili recentemente abbandonati e rimuoverli dalla memoria. Indipendentemente dalla vostra teoria, dato che il computer inizia a esaurire la memoria, la raccolta dati inutili dovrebbe raccogliere tutti gli oggetti inutilizzati e smaltirli. Invece il mio computer si ferma! –

+0

@OrbitingEden: se la memoria non viene raccolta quando necessario, è molto probabile che si verifichi una perdita di memoria effettiva. Il netturbino dovrebbe calciare quando si sta esaurendo. – Guffa

+2

Quindi immagino che la domanda sia migliore: come può una perdita di memoria javascript pervadere attraverso aggiornamenti e navigazioni della pagina? È impossibile, vero? –