2012-05-15 21 views
6

Me doy cuenta, en mi aplicación, que la memoria asociada con el proceso de IE en Win7 aumenta en 20-30 MB con cada actualización de página. Una vez que alcanzo alrededor de 1,5 GB, el navegador deja de responder. Estoy usando IE9, y solo puedo reproducir esto en IE9. No hay problema en Chrome, FF, IE7 o IE8. De hecho, el problema tampoco ocurre cuando se ejecuta IE9 en modo compatibilidad.Fuga de memoria IE9

En particular, me pregunto cómo la memoria podría perder incluso después de una actualización de página. ¿Alguien más ha visto esto?

+1

este es un problema bastante difícil de abordar. Supongo que podría ser por muchas razones, lo siento :-( – Sebas

+1

No hay forma de proporcionar fragmentos de código para una aplicación a gran escala. Si pudiera proporcionar fragmentos, ya tendría mi respuesta, ya que esto me obligaría a reducir el problema. a un área específica del código. Como dice mi pregunta, estoy buscando otros que se hayan encontrado en la misma situación que yo: pérdida de memoria incluso después de la recarga de la página (solo IE9), así como algunas explicaciones sobre cómo esto podría suceder, en un sentido general. –

+0

Echa un vistazo a mi nueva respuesta Ray, acaba de resolver este problema hoy (tuvo el mismo problema con la versión más reciente de un producto) –

Respuesta

3

En el pasado, Internet Explorer tenía algunos problemas con las referencias entre las variables de JavaScript habituales y los objetos DOM. Por lo tanto, si no recuerdo mal, una referencia circular como esto

var e = document.createElement('div'); 
var x = { elementReference: e }; 
e.jsReference = x; 

no sería recolección de basura, incluso si no había otras referencias a e y x. Esto se debe a que IE usó diferentes métodos de recolección de basura para elementos DOM y JavaScript.

Ahora, creía que este problema ya se había solucionado en IEs de versiones superiores, pero tal vez no lo era. Intente encontrar todas esas referencias problemáticas y eliminarlas manualmente si ya no las necesita.

e.jsReference = null; 
x.elementReference = null; 

Editar: Prueba en IE 8

me escribió esta sencilla página web de prueba.

<html> 
    <head> 
    <title>Leak test</title> 
    <script> 
     function leak() { 
     var e = document.createElement('div'); 
     var x = { elementReference: e }; 
     e.jsReference = x; 
     } 

     function test() { 
     for (var i = 0; i < 10000; i++) 
      leak(); 
     alert('Done'); 
     } 
    </script> 
    </head> 
    <body> 
    <input type="button" value="test" onclick="test();" /> 
    </body> 
</html> 

He probado esto en IE 8, ya que no tengo IE 9 instalado en esta máquina. Sin embargo, esto todavía puede ser relevante ya que muestra que el problema aún estaba presente incluso en versiones bastante recientes de IE y por lo tanto puede persistir incluso en IE 9.

Abrí la página y observé el uso de la memoria. Después de presionar el botón, el uso de memoria aumentó en varios MB. Después de refrescar la página web, no pasó absolutamente nada. Después de cerrar IE, el uso de memoria volvió a su estado original.

Puede intentarlo usted mismo en IE 9. Por supuesto, probablemente no esté asignando 10000 objetos de referencia circularmente en su código, pero probablemente cree objetos más grandes que pueden contener alguna referencia circular que aún no haya encontrado.

+0

¿Esto explicaría la memoria de rápido crecimiento con cada página de recarga? Yo estaba debajo de la La impresión de que el problema de las referencias circulares entre los objetos host y los objetos nativos no explicaría el aumento de la memoria con cada recarga de página. Además, no estoy creando explícitamente ningún ref circular. –

+0

@ user48 6979 Editado mi respuesta. – Imp

6

No estoy seguro de si este sería su problema, pero también estaba recibiendo este problema de fuga de memoria IE9 donde la memoria seguía creciendo y creciendo (aproximadamente 20 mg por actualización/cambio de página).

Si está utilizando Modernizr (esto debería arreglarse ahora en uno de los lanzamientos más recientes, más de 2.5+ creo), pero si está usando una versión anterior (y no puede simplemente actualizarla por algún motivo), entonces todo lo que tiene que hacer es sustituir uno return comunicado.

El problema se produce con Modernizr/Geolocalización & IE9, en realidad es un problema hereda con IE9, no tanto Modernizr.

return 'geolocation' in navigator 

en lugar de:

return !!navigator.geolocation // this causes the memory leak (silly IE9) 

https://github.com/Modernizr/Modernizr/issues/513

Tome un vistazo a ese enlace, pero básicamente la instrucción de retorno para la prueba Geolocalización necesita ser cambiado, y este problema se corregirá sola!

+1

Ese fue mi problema y tu sugerencia me salvó. Upvote bien merecido! –

+0

@danradu en cualquier momento :) Sí, esto me volvió loco durante un tiempo también ... ¡me alegro de haber ayudado a alguien más! –

+1

Wow ... una solución tan simple a un problema que nos ha estado molestando por un tiempo. ¡Gracias! –