7

Los navegadores IE6 e IE7 de Microsoft sufren pérdidas de memoria cuando se usan ciertos patrones de código JavaScript. Encontré mucha información sobre los patrones de fuga en los primeros días de IE6. Sin embargo, entiendo que muchos (pero no todos) de estos se arreglaron en IE7 y en un paquete de servicio para IE6. No puedo encontrar una fuente confiable de información sobre qué filtraciones aún permanecen en esas versiones parcheadas de IE6 e IE7.Tener dificultades para usar los detectores de fuga de IE Javascript

Hay un par de herramientas para detectar patrones de fugas. ¡Pero parece que no puedo usarlos como quiero!

  • El detector de fugas de memoria de Microsoft (V2) no encuentra ninguna fuga en mi código incluso cuando utilizo patrones que deben tener fugas. Esto puede deberse a que estoy ejecutando IE8. ¿Hay alguna manera de evitar que parezca ser IE6 o IE7?

  • Drip and sIEve parecen encontrar toneladas de fugas de la variedad "huérfana". Seguramente estos deben ser falsos positivos: prácticamente todos los elementos que agrego al documento y luego quito de nuevo aparecen en la lista, y no creo que guarde referencias a ellos. Y si son reales, ¿cómo puedo encontrar el lugar en mi código que están goteando? Las herramientas tienen una función de 'propiedades' que no muestra nada, lo que hace que parezca roto. De nuevo, no tengo idea de si estas filtraciones son relevantes para IE6 o IE7, o solo para IE8, que es la versión de IE que he instalado.

Así que realmente me gustaría saber qué tipos de pérdidas de memoria son todavía un problema con las versiones parcheadas de IE6 e IE7, y cómo encontrar una manera efectiva en mi código en vivo usando herramientas para ayudarme.

¿Algún ayuda?

+0

Gracias por su respuesta galambalazs! Estoy decepcionado de que la recompensa de 250 puntos no me haya dado más respuestas ... – thomasrutter

Respuesta

2

No creo que haya una herramienta efectiva para detectar fugas de memoria. Sin embargo, hay una pieza de software que puede usar para emular IE 6-7-8 en su PC, se llama IE Tester.

La fuga más común que Internet Explorer tuvo es una interacción con JScript.

Cuando un objeto DOM contiene una referencia a un objeto de JavaScript (un función de manejo de tal evento), y cuando que JavaScript objeto contiene una referencia a ese objeto DOM, a continuación, se forma una estructura cíclica . - http://javascript.crockford.com/memory/leak.html

Esta estructura cíclica es lo que IE tiene tiempos difíciles tratando. Debe comprender cómo se forman las referencias cíclicas (a través del cierre). El primer paso sería limpiar los elementos DOM antes de eliminarlos.

Esto se puede hacer mediante una función general de esta manera:

function purge(d) { 
    var a = d.attributes, i, l, n; 
    if (a) { 
     l = a.length; 
     for (i = 0; i < l; i += 1) { 
      n = a[i].name; 
      if (typeof d[n] === 'function') { 
       d[n] = null; 
      } 
     } 
    } 
    a = d.childNodes; 
    if (a) { 
     l = a.length; 
     for (i = 0; i < l; i += 1) { 
      purge(d.childNodes[i]); 
     } 
    } 
} 

Cada vez que se quita elementos del DOM es necesario utilizar purge en ella en primer lugar.Puede incluso escribir un contenedor para que

function safeRemove(el) { 
    purge(el); 
    el.parentNode.removeChild(el); 
} 

Por supuesto que es sólo un punto de partida, ya que no le ayudará con referencias en otros lugares (como controladores de eventos DOM2, o en cualquier otro lugar, aunque cierre). Debe verificar los lugares donde elimina elementos y averiguar qué funciones los referencian.

Parece que este problema todavía existe en IE 6-7-8.

+0

¿JQuery hace eso de fábrica cuando llamas a '.remove()'? –

+1

Buena pregunta. Lo he probado y para los eventos que agregaste a través de jQuery está bien, pero los eventos agregados de otra manera parecen tener fugas (con jQuery 'eliminar'). – galambalazs

Cuestiones relacionadas