2010-06-21 13 views
6

El libro de aprendizaje jQuery dice IE tiene pérdida de memoria para el objeto DOM que tenga una propiedad hace referencia a una función, y la función también hace referencia al objeto DOM, teniendo así una "referencia circular", así:En Internet Explorer, ¿por qué se mantiene la pérdida de memoria, incluso cuando se navega fuera de las páginas?

onload = function() { 
    var foo = document.getElementById('foo'); 
    foo.onclick = function() { // DOM object foo's onclick property refers to a function 
     foo.innerHTML = "hello" // the function's body refers to the DOM object 
    }       // therefore circular reference 
} 

IE puede manejar referencias circulares para la recolección de basura, pero no cuando las referencias circulares involucran tanto el objeto DOM como el objeto Javascript, ya que son manejados por diferentes administradores de memoria.

y:

[la pérdida de memoria ... y] la [referencia] bucle resultante no puede ser liberado por el IE incluso cuando navegamos lejos de la página.

nunca se libera hasta que se cierra el navegador.

¿Es cierto? ¿Por qué IE no libera esos recuerdos incluso cuando un usuario abandona la página? ¿Es porque el usuario puede hacer clic en Back y volver a la página, y IE quiere mantener el estado de la página? En ese caso, ¿qué pasa si el usuario está en la página de pérdida de memoria y luego hace clic en Back y luego va a google.com? Entonces la página no se puede ver con Back o Forward, y el problema de pérdida de memoria puede desaparecer sin cerrar el navegador?

¿O incluso cuando la pestaña está cerrada, sin cerrar el navegador?

¿Este tipo de pérdida de memoria también ocurre en IE 8?

+0

Muchos programas tienen problemas con pérdidas de memoria; y si bien muchas pérdidas de memoria se han conectado a las versiones más recientes de IE, es difícil conectarlas a todas en un proyecto de este tamaño. – Piskvor

Respuesta

3

Las pérdidas de memoria son una clase de errores de programa, por lo que básicamente se pregunta "¿por qué IE funciona con errores?". La respuesta a eso es, obviamente, "porque un programador, en alguna parte, cometió un error".

Mientras que algunos navegadores mantienen intencionalmente el estado de la página incluso cuando navegas (especialmente Opera y FF), una "pérdida de memoria" significa memoria que el programa ya no usa, pero se olvidó de liberar. En este caso, IE ha dejado de preocuparse por esa parte de la memoria, pero no le dijo esto al sistema operativo (Windows), que todavía lo ve como "usado por IE". Así que esta parte de la memoria se cuelga en tierra de nadie, hasta que el navegador se cierra, porque cuando el proceso del navegador finaliza, el sistema operativo marca toda la memoria asignada a ese proceso como "libre".

Las pérdidas de memoria son un tipo de error bastante insidioso, porque el programa parece funcionar correctamente, pero consume poco a poco más y más memoria.

Véase p. http://en.wikipedia.org/wiki/Circular_reference y http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) para leer más sobre este tema.

+0

¿No tienen esas "referencias circulares" un alcance de "nivel de página"? Entonces, cuando esta página pierde memoria y hacemos clic en 'Atrás' y vamos a google.com, esa página esencialmente "desaparece" de la secuencia 'Atrás' y 'Adelante', y podemos liberar toda la memoria relacionada con esa página. –

+0

@Jian Lin: Sí, esa es la forma en que * supuestamente * funciona. Sin embargo, un programador de IE probablemente se olvidó de verificar si todas las referencias de página se liberaron correctamente, y mientras IE * piensa * que se ha limpiado correctamente, dejó algunos datos en la memoria y ya no los conoce. – Piskvor

+1

@Jian: Sería bueno si eso funcionara. El hecho de que este problema persista indica que el recolector de basura piensa que todavía se hace referencia a la memoria correctamente (aunque tal vez por una ruta inesperada) o que el recolector de basura es demasiado estúpido para reclamar la memoria, o incluso que no hay recolector de basura . No es posible evaluar cuál es el problema sin la fuente de IE (o descompilarlo, que sería un segundo mejor). –

1

La fuga está allí porque uno de los programadores de la aplicación (en este caso IE) no pudo deshacerse de algo (objeto, recurso) que estaba utilizando la memoria.

en MSDN the three commonest causes of leaks in managed applications se consideran:

  • Sosteniendo referencias a objetos gestionados
  • El no poder liberar recursos no administrados
  • El no poder disponer los objetos de dibujo
Cuestiones relacionadas