2009-07-03 9 views
8

Ho letto fino a cercare di dare un senso alle perdite di memoria nei browser, esp. IE. Comprendo che le perdite sono causate da una mancata corrispondenza negli algoritmi di raccolta dei rifiuti tra il motore Javascript e l'albero degli oggetti DOM e continueranno a persistere. Quello che non capisco è il motivo per cui (secondo alcune affermazioni contenute negli articoli che sto leggendo) la memoria non viene recuperata dopo che la pagina è stata scaricata dal browser. Navigare lontano da una pagina web dovrebbe mettere tutti gli oggetti DOM e javascript fuori dal campo di applicazione in quel punto, non dovrebbe?Perdite di memoria Javascript dopo lo scarico di una pagina Web

+0

esattamente perché sono perdite :) La memoria non può essere recuperata. –

risposta

8

Ecco il problema. IE ha un garbage collector separato per il DOM e per javascript. Non possono rilevare riferimenti circolari tra i due.

Quello che eravamo abituati a pulire tutti i gestori di eventi da tutti i nodi alla pagina di scarico. Ciò potrebbe tuttavia bloccare il browser durante lo scaricamento. Ciò riguardava solo il caso in cui il riferimento circolare era causato da gestori di eventi. Potrebbe anche essere causato dall'aggiunta di riferimenti diretti dai nodi DOM agli oggetti js che avevano un riferimento al nodo DOM stesso.

Un'altra cosa buona da ricordare è che se si eliminano i nodi, è una buona idea rimuovere prima gli handler. Ext-js ha un metodo Ext.destroy che fa proprio questo (se hai impostato i gestori usando ext).

Esempio

// Leaky code to wrap HTML elements that allows you to find the custom js object by adding 
//a reference as an "expando" property 
function El(node) { 
    this.dom = node; 
    node.el = this; 
} 

Poi Microsoft IE hackerato quindi rimosso tutti i gestori di eventi e le proprietà expando quando lo scarico interno, quindi è molto più veloce di farlo con js. Questa soluzione sembrava risolvere i nostri problemi di memoria, ma non tutti i problemi in quanto ci sono ancora persone che hanno il problema.

MS's description of the problem

MS releases patch that "fixes" memory leaks:

Blog about fixed memory leaks

IE still has some problems

Nella nostra azienda, usiamo ext-js. Impostando sempre i gestori di eventi usando ext-js, che ha una routine di pulizia interna, non abbiamo riscontrato perdite di memoria. In realtà, l'utilizzo della memoria cresce ma si ferma a circa 250 Mb per una macchina con 4 GB di RAM. Non pensiamo che sia un peccato poiché cariciamo circa 2Mb (non compresso) di file js e tutti gli elementi della pagina sono dinamici.

C'è molto da dire su questo e abbiamo studiato in modo approfondito dove lavoro. Sentiti libero di fare una domanda più specifica. Potrei essere in grado di aiutarti.

+0

Grazie per la tua ricerca, IE9 è migliorato? Stiamo sperimentando perdite solo impostando la proprietà innerHTML, i client sono in esecuzione su VMWARE e la memoria perde rapidamente. Chiedere agli utenti della rete intranet di riaprire l'app non è la soluzione, ma non abbiamo scelta. –

+1

@AlexanderN Se si sta verificando un aumento della memoria durante l'impostazione di 'innerHTML', è molto probabile che si stiano creando perdite rimuovendo i nodi dal DOM senza distaccare i gestori ad essi collegati. Non dovresti mai sovrascrivere 'innerHTML' senza prima rimuovere qualsiasi gestore. Questo vale per qualsiasi browser. –

3

La cosa migliore che abbia mai letto su Javascript memory leaks è stata scritta da Doulgas Crockford.

Per rispondere alla tua domanda, sì, il browser deve assolutamente scaricare tutti gli oggetti (e, soprattutto, i gestori di eventi) al momento opportuno. Se lo facesse, non avrebbe perdite :)

0

Non è necessario dare un senso a loro - sono bug in broswers e vengono corretti dalle versioni alle versioni.

+0

Solo perché una versione viene corretta non esclude il bug; le versioni precedenti del browser rimarranno in uso a meno che non sia possibile ottenere l'upgrade di tutti i clienti. Quando si fa lo sviluppo web, capire come funziona il browser è incredibilmente importante. –

Problemi correlati