2011-08-16 8 views
11

Il seguente codice di codice creerebbe una perdita di memoria.jQuery.data può causare una perdita di memoria?

Secondo la documentazione di jQuery, l'uso della funzione data evita perdite di memoria. Sarebbe utile confermare se quanto segue è sicuro.

var MyClass = function(el) { 
    // Store reference of element in object. 
    this.element = $(el); 
}; 

// Store reference of object in element. 
$('#something').data('obj', new MyClass('#something')); 
+0

Perché non si salva il riferimento nell'oggetto js globale? –

+0

@ant_Ti Mi piacerebbe avere un accesso bidirezionale. Ad esempio, in un gestore di eventi vorrei accedere a 'obj', ma vorrei anche poter accedere all'elemento da' obj'. –

+0

Ho modificato la domanda per rimuovere le citazioni di riferimenti circolari, poiché questo esempio non ne contiene uno. (Anche se potrebbe sembrare) – mikerobi

risposta

7

Ovviamente il codice così com'è occuperebbe memoria aggiuntiva finché l'elemento DOM è ancora connesso al DOM. Ma suppongo che tu stia chiedendo se continuerà ad usare memoria extra dopo che l'elemento DOM non è più in uso.

Aggiornamento: Grazie per la risposta di Joey (che da allora ha cancellato), ho passato un po 'di tempo leggendo su memory leaks in javascript, e sembra la mia ipotesi nel paragrafo seguente non sono corretti. Poiché gli elementi DOM non utilizzano la garbage collection pura, un riferimento circolare come questo normalmente impedirebbe il rilascio sia dell'elemento DOM sia dell'oggetto javascript. Tuttavia, credo che il resto di questa risposta sia ancora corretto.

Senza una profonda conoscenza di come i motori javascript implementano la garbage collection, non posso parlare autorevolmente sull'argomento. Tuttavia, la mia comprensione generale della garbage collection mi fa pensare che il tuo codice sarebbe "sicuro" nel senso che dopo che l'elemento #something è stato rimosso dal DOM, l'oggetto MyClass risultante avrebbe solo un riferimento a un oggetto che non ha altre connessioni . Gli algoritmi del grafico del garbage collector dovrebbero essere in grado di identificare che l'elemento DOM e il suo oggetto MyClass sono "fluttuanti nello spazio" e non connessi a tutto il resto.

Inoltre, jQuery si impegna a rimuovere i dati e gli eventi associati a un determinato elemento DOM una volta rimosso dal DOM. Dalla documentation:

jQuery assicura che i dati viene rimosso quando elementi DOM vengono rimossi tramite metodi jQuery, e quando l'utente lascia la pagina.

Quindi supponendo che si utilizza jQuery in modo coerente, si avrebbe solo un riferimento a senso una volta che l'oggetto viene rimosso dal DOM in ogni caso, che lo rende che molto più facile possibile per il garbage collector per sapere si può ottenere liberarsi di questi oggetti.

Quindi, finché non si dispone di qualcos'altro che fa riferimento all'oggetto MyClass una volta rimosso l'elemento DOM, non si dovrebbe avere una perdita di memoria.

+0

grazie che aiuta davvero –

-4

L'attributo di dati memorizza solo i valori di stringa.

+2

In jQuery può essere qualsiasi tipo di Javascript, inclusi Array o Oggetto. –

+0

@ant_Ti - dove si dice che nel documento? – Neal

+0

[.data()] (http://api.jquery.com/data/) descrizione dice ** valore ** Il nuovo valore dei dati; può essere qualsiasi tipo di Javascript incluso Array o Object. –

0

Suppongo che dipenda dal motore Javascritp.

Hai una domanda abbastanza precisa per eseguire un test. Ho aggiunto una lunga stringa nell'oggetto e ho eseguito la perdita potenziale in un loop di grandi dimensioni.

Come risultato, non penso a perdite in IE8 né in Chrome.

Ma non è stato possibile riprodurre these leakeage patterns.

0

Ciò può causare una perdita di memoria. la teoria del metodo jQuery.data può utilizzare una classe interna di Data per memorizzare i dati per l'elemento dom.

ovviamente, quando si rimuovono i dati della cache, jQuery rimuoverà i dati. ma la cache interna è un array crescente, quando tu lo farai, andrà avanti.

quindi, alla fine, ci sarà un array di cache molto grande, che porterà alla perdita di memoria. In un'applicazione web a lungo termine, questo potrebbe causare un arresto anomalo della memoria.