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.
este es un problema bastante difícil de abordar. Supongo que podría ser por muchas razones, lo siento :-( – Sebas
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. –
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) –