2011-11-04 8 views
9

Soy consciente de que no es fácil de manejar correctamente la memoria dentro de una aplicación con gran cantidad de elementos de interfaz de usuario y completamente basado en Ajax (en mi aplicación las páginas no se vuelven a cargar). Pero me gustaría entender el siguiente comportamiento:jQuery.remove(), separe los elementos DOM, pero aún puedo acceder a los elementos desde el código. ¿Cómo evitar fugas?

Tengo un elemento raíz al que debe adjuntarse un solo elemento secundario a la vez (piense que es el elemento raíz el contenedor de la aplicación y el elemento secundario las páginas únicas). Cada vez que cambio de contenido secundario, elimino el contenido anterior con jQuery.remove(), pero veo que el contenido está realmente separado del DOM, pero permanece en la memoria.

  1. raíz y dos contenidos niño (child1 y CHILD2)
  2. de child1 me cambio a CHILD2, pidiéndole a mi gestor de aplicaciones para eliminar child1 antes de acoplar se adjunta child2
  3. child2 (puedo verlo), pero todavía puedo utilizar elementos child1 del código que maneja

código child1 child1 (que contiene referencias a child1 DOM):

function testaccess(){ 
    load_and_remove(child2); 
    var child1DOM = get_this_dom(); 
} 

child1DOM sigue ahí, y puede manipularla como si todavía estaba unido a la DOM.

Ok, supongo que jQuery.remove() y el GC no podrán liberar memoria hasta que tenga un código que pueda acceder a ella, pero incluso si no invoco get_this_dom(), incluso después de salir de testaccess(), veo que la memoria FF no disminuye ...

me pregunto cómo hacer GC liberar toda la memoria, cuando salgo child1.

+0

un vistazo rápido a la derecha "relacionadas" Preguntas enlaces reveló un caso similar -> http://stackoverflow.com/q/768621/104380 – vsync

Respuesta

6

No se eliminará de la DOM hasta que todas las referencias a ella son liberados.

usted debe tratar de eliminar todas las referencias circulares entre la JS DOM y hacer DOM - que ambos tienen los recolectores de basura separados y funcionan por separado. Por lo tanto, por qué el recolector de basura JS de marca y barrido no los detecta.

Se podría tratar de reelaborar el código para romper la referencia circular:

var mything = something(); 
mything = null; 

Aquí hay un par de artículos que podrían útiles:

http://msdn.microsoft.com/en-us/library/Bb250448

http://www.javascriptkit.com/javatutors/closuresleak/index.shtml

http://javascript.info/tutorial/memory-leaks

Estoy bastante seguro de que podría encontrar algo más rápidamente sobre esto.

Además, puede probar el .empty() para liberar todos los nodos secundarios pero llama a .remove() para hacer un poco de trabajo.

Tenga en cuenta que algunas de estas cuestiones fueron fijadas en las nuevas versiones de jQuery es decir 1,5 es mejor que 1,4 por ejemplo.

Otro mensaje el SO en este: jQuery memory leak with DOM removal

+1

Gracias por sus respuestas . Trataré de refactorizar algunos puntos de mi código, incluso si ya son miles de líneas :( (Satckoverflow no envía respuestas a mi correo electrónico, entonces me disculpo por no responder rápidamente ... pensé que nadie respondía ¡yo!) – giohappy

Cuestiones relacionadas