Perché i browser perdono memoria?

7

Un collega e io stavamo parlando dei browser (usando un oggetto di controllo del browser in un progetto), e appare chiaro come il giorno che tutti i browser (Firefox, Chrome, IE, Opera) mostrano le stesse caratteristiche o gli stessi effetti collaterali di il loro utilizzo e quello di "perdita di memoria".

Qualcuno può spiegare perché è così? Sicuramente come con qualsiasi forma di codice, ci dovrebbe essere una corretta garbage collection?

PS. Ho letto alcuni schemi difensivi sul perché questo può accadere dal punto di vista dello sviluppatore. Sono a conoscenza di un articolo che Crockford ha scritto su IE; ma perché il problema è sintomatico di ogni browser? Grazie

    
posta Dane Balia 05.11.2012 - 06:03
fonte

3 risposte

17

Ci sono 4 posti in cui un browser può perdere memoria:

La pagina web

Nei browser moderni questo è pienamente a carico dello sviluppatore web. Gli ambienti raccolti dalla raccolta dei rifiuti non raccolgono la memoria a cui si fa ancora riferimento, e ci sono molti modi per mantenere la memoria di riferimento senza senso (ad esempio creare una chiusura da collegare come gestore di eventi e includere accidentalmente un gruppo di variabili in quella ambito di chiusura). Uno sviluppatore web può risolvere queste perdite completamente gestendo correttamente i riferimenti variabili nel loro codice. In genere un ricaricamento della pagina libera la memoria.

Componenti aggiuntivi

Se i componenti aggiuntivi sono scritti anche in un linguaggio raccolto con garbage (come javascript), allora soffrono dello stesso problema. Tuttavia, un ricaricamento della pagina di solito non libera questa memoria, quindi sembra che il browser stia perdendo memoria mentre in realtà è colpa dello sviluppatore aggiuntivo. Per quanto ne so, questa è la causa principale delle fughe di browser (ecco perché la raccomandazione predefinita è di verificare se la perdita si verifica senza componenti aggiuntivi).

Motore del browser

Tutti i motori di browser moderni sono scritti in C ++. Il C ++ non è sottoposto a garbage collection, ma utilizza invece allocazione di memoria esplicita. Se gli sviluppatori assegnano la memoria e poi dimenticano di deallocarla, il motore perde memoria. Per quanto ne so, tutti i produttori di browser eseguono numerosi test e revisione del codice per trovare e risolvere questo tipo di perdite. Non è fisso al 100% e non lo sarà mai, ma non è più un problema enorme.

Non perdite

Infine ci sono una serie di funzionalità di memorizzazione nella cache che significano che il processo del browser crescerà nell'ambito durante l'utilizzo. Queste non sono perdite, sono intese per utilizzare in modo ottimale la RAM disponibile. In genere l'ingombro della memoria cresce al massimo e poi si ferma lì.

    
risposta data 05.11.2012 - 09:33
fonte
12

Ecco la risposta migliore che ho trovato sulla rete, Perdita di memoria in Internet Explorer - rivisitato e uno snippet per spiegare perché:

The above pattern will leak due to the circular reference created between a DOM node and a JS element.

Since the JScript garbage collector is a mark and sweep GC, you may think that it would handle circular references. And in fact it does. However this circular reference is between the DOM and JS worlds. DOM and JS have separate garbage collectors. Therefore they cannot clean up memory in situations like the above.

    
risposta data 05.11.2012 - 07:18
fonte
2

Non sarei sorpreso se quello che stai categorizzando come "perdite" sia invece un po 'di cache aggressivo. Ancora oggi, il tempo di andata e ritorno della rete è "costoso" (in termini di tempo) rispetto al recupero di qualcosa da una cache in memoria. Consiglierei di prendere il codice sorgente per Firefox o Chromium e dare un'occhiata a come gestiscono le loro cache. So che Firefox supporta almeno la riapertura di finestre / schede chiuse di recente, quindi chiudere completamente un sito non significa necessariamente che le immagini e gli script della cache siano stati eliminati.

    
risposta data 05.11.2012 - 20:14
fonte

Leggi altre domande sui tag