Riferimenti circolari a oggetti DOM in una pagina HTML causano una perdita di memoria

Dichiarazione di non responsabilità per contenuto KB ritirato

Il contenuto di questo articolo è riferito a prodotti per cui Microsoft non offre più il supporto. Questo articolo viene pertanto offerto "così com'è" e non sarà più aggiornato.

Sintomi

Quando si aggiorna una pagina HTML che utilizza codice Microsoft JScript che contiene riferimenti circolari agli oggetti in di Microsoft Internet Explorer DOM Document Object Model (), si verifica una perdita di memoria.

Causa

La perdita di memoria si verifica poiché DOM JScript non oggetti. Gli oggetti DOM non sono presenti nella combinazione di insieme di mark-and-sweep garbage di JScript. Pertanto, il riferimento circolare tra gli oggetti DOM e i gestori di JScript non sarà interrotto fino a quando il browser rimuove completamente la pagina. La perdita di memoria terminerà quando il browser apre una nuova pagina Web o alla chiusura della finestra del browser.

Risoluzione

Per risolvere il problema, evitare riferimenti circolari agli oggetti DOM di Internet Explorer nel codice Jscript. Per risolvere questo problema nel codice di esempio incluso nella sezione "Informazioni" di questo articolo, apportare le modifiche seguenti:
function hookup(element){
element.attachEvent( "onmouseover", mouse);
}
function mouse ()
{
}

Con questa modifica, la funzione di mouse non è un oggetto di chiusura che conduce a un riferimento circolare.

Stato

Microsoft ha confermato che si tratta di un bug nei prodotti Microsoft elencati nella sezione "Si applica a".

Ulteriori informazioni

Procedura per riprodurre il comportamento

  1. Incollare il codice seguente nel blocco note e quindi salvare il file come 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>
    In questo codice, il gestore (la funzione mouse ) è annidato all'interno di attacher (la funzione di aggancio ). Ciò significa che il gestore sia chiuso nell'ambito del chiamante (questa disposizione è denominata una "chiusura"). Il gestore conserva un riferimento all'elemento variabile. In questo caso, l'elemento variabile è l'elemento div HTML con il parametro ID impostato su menu. Ma l'elemento div fa riferimento al gestore. Questo riferimento è un riferimento circolare.
  2. Aprire test. htm in Internet Explorer.

    Si noti che l'utilizzo della memoria in Task Manager Windows continua ad aumentare ogni volta che la pagina viene automaticamente aggiornato.

Riferimenti

Per ulteriori informazioni sui modelli di perdita di Internet Explorer, visitare il seguente sito Web Microsoft Developer Network (MSDN):
Proprietà

ID articolo: 830555 - Ultima revisione: 30 gen 2017 - Revisione: 1

Feedback