change javascript jquery memory-leaks circular-reference

javascript - change - jquery set value



¿Puede jQuery.data causar una pérdida de memoria? (4)

¿El siguiente fragmento de código crearía una pérdida de memoria?

De acuerdo con la documentación de jQuery, el uso de la función de data evita fugas de memoria. Sería útil confirmar si lo siguiente es seguro.

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''));


El atributo de datos solo almacena valores de cadena.


Obviamente, el código en su forma actual ocuparía más memoria siempre que el elemento DOM aún esté conectado al DOM. Pero supongo que estás preguntando si continuaría usando memoria extra después de que el elemento DOM ya no esté en uso.

Actualización : gracias a la respuesta de Joey (que ha eliminado desde entonces), me dediqué a leer filtraciones de memoria en javascript , y parece que mis suposiciones en el párrafo siguiente son incorrectas. Debido a que los elementos DOM no usan la recolección de basura pura, una referencia circular como esta normalmente evitaría que tanto el elemento DOM como el objeto javascript se liberen. Sin embargo, creo que el resto de esta respuesta sigue siendo correcta.

Sin un conocimiento profundo de cómo los motores de JavaScript implementan la recolección de basura, no puedo hablar con autoridad sobre el tema. Sin embargo, mi comprensión general de la recolección de basura me hace pensar que su código sería "seguro" en el sentido de que después de #something elemento #something del DOM, el objeto MyClass resultante solo tendría una referencia a un objeto que no tiene otro conexiones. Los algoritmos de gráfico del recolector de basura deberían poder identificar que el elemento DOM y su objeto MyClass están "flotando en el espacio" y desconectados de todo lo demás.

Además, jQuery se desvía de los datos y eventos que están asociados con un elemento DOM dado una vez que se elimina del DOM. De la documentación :

jQuery garantiza que los datos se eliminen cuando los elementos DOM se eliminan mediante métodos jQuery y cuando el usuario abandona la página.

Por lo tanto, suponiendo que utilice jQuery de forma consistente, solo tendrá una referencia unidireccional una vez que el objeto se elimine del DOM de todos modos, lo que hace que sea mucho más fácil para el recolector de basura saber que puede deshacerse de estos objetos.

Así que mientras no tenga algo más que haga referencia al objeto MyClass una vez que se elimine el elemento DOM, no debería tener una pérdida de memoria.


Supongo que depende del motor Javascritp.

Usted tiene la pregunta con la suficiente precisión para realizar una prueba. Agregué una cadena larga en el objeto y ejecuté la fuga potencial en un bucle grande.

Como resultado, no creo en fugas en IE8 ni en Chrome.

Pero tampoco pude reproducir estos patrones de filtración .


Esto puede conducir a una pérdida de memoria. la teoría del método jQuery.data puede usar una clase interna de datos para almacenar datos en caché para el elemento dom.

por supuesto, cuando elimina los datos de caché, jQuery desvinculará los datos. pero el caché interno es una matriz creciente, cuando lo haces, continuará.

así que, al final, habrá un gran conjunto de caché, lo que provocará una fuga de memeory. En una aplicación web a largo plazo, esto puede provocar un bloqueo de memoria.