Las referencias circulares a objetos DOM en una página HTML causan una pérdida de memoria

Exención de responsabilidades de contenido KB retirado

Este artículo se refiere a productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Nº de error: 28355 (IEOESE)

Síntomas

Se produce una pérdida de memoria cuando se actualiza una página HTML que utiliza código de Microsoft JScript que contenga referencias circulares a objetos en el Document Object Model (DOM) de Microsoft Internet Explorer.

Causa

Esta pérdida de memoria se produce porque los objetos DOM son objetos de JScript no. Objetos DOM no están en el esquema de la colección de basura de marca y barrido de JScript. Por lo tanto, la referencia circular entre los objetos DOM y los controladores de JScript no se rompan hasta que el explorador destruye completamente la página. Esta pérdida de memoria finalizará cuando el explorador abre una nueva página Web o cuando se cierra la ventana del explorador.

Solución

Para resolver este problema, evitar las referencias circulares a objetos DOM de Internet Explorer en el código de Jscript. Para evitar este problema en el código de ejemplo que se incluye en la sección "Más información" de este artículo, realice el siguiente cambio:
function hookup(element){
element.attachEvent( "onmouseover", mouse);
}
function mouse ()
{
}

Con este cambio, la función del ratón no es un objeto de cierre que conduce a una referencia circular.

Estado

Microsoft ha confirmado que se trata de un error de los productos de Microsoft que se enumeran en la sección "Aplicable a".

Más información

Pasos para reproducir el comportamiento

  1. Pegue el código siguiente en Bloc de notas y, a continuación, guarde el archivo como Test.htm:
    <HTML><HEAD>
    <script language="javascript">
    function initpage()
    {
    window.setTimeout("window.location.reload()", 500, "javascript");
    }
    </script>
    </HEAD>
    <body onload="initpage()" >
    <div class='menu' id='menu'></div>
    <script language='javascript'>
    hookup(document.getElementById('menu'));
    function hookup(element)
    {
    element.attachEvent( "onmouseover", mouse);
    function mouse ()
    {
    }
    }
    </script>
    </body>
    </HTML>
    En este código, el controlador (la función de ratón ) se anida dentro el fijador (la función de enlace ). Esta disposición significa que el controlador se cierra en el ámbito de aplicación del llamador (este tipo de organización se denomina un "cierre"). El controlador mantiene una referencia al elemento variable. En este caso, el elemento variable es el elemento div HTML con el parámetro ID que se establece en el menú. Pero el elemento div se refiere al controlador. Esta referencia es una referencia circular.
  2. Abra Test.htm en el Explorador de Internet.

    Observe que el uso de memoria en el Administrador de tareas de Windows sigue aumentando cada vez que la página se actualiza.

Referencias

Para obtener más información acerca de los patrones de pérdida de Internet Explorer, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
Propiedades

Id. de artículo: 830555 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios