Pergunta

Eu tenho um aplicativo web enorme que está tendo problemas com vazamento de memória no IE 6.

É fácil corrigir um vazamento de memória em um exemplo de código de 5 linhas que demonstra o problema.

Mas se eu tiver um aplicativo muito grande, por onde devo começar?

Foi útil?

Solução

Confira Pingar.Isso geralmente elimina as suposições sobre vazamentos de memória do IE.

Se por algum motivo o Drip não o encontrar, dê uma olhada em qualquer código JavaScript que funcione com eventos.Essa é quase sempre a origem de qualquer vazamento significativo de memória em um navegador.

Destruir um elemento DOM com manipuladores anexados a ele, sem removê-los primeiro, impedirá que a memória associada a esses manipuladores seja recuperada.

Outras dicas

O aplicativo usa muito JavaScript?

Se isso acontecer, descobri que uma coisa que ajuda a evitar vazamentos de memória é garantir que você esteja usando uma estrutura JavaScript, como Prototype ou jQuery, porque eles tentaram e testaram código de manipulação de eventos que não vaza memória.

Aqui está como resolvi o problema de vazamento de memória no IE7.A ideia é descartar/definir como nulas todas as propriedades de expansão em todos os nós DOM ao descarregar a página.Isso funcionou para mim.Você pode achar útil.

<!--[if lt IE 8]>
<script type="text/javascript">

function disposeAll() {
    if (window.document.all) {
        for (var index = 0; index < window.document.all.length; index++) {
            try { dispose(window.document.all[index], []); } catch (e) { debugger; }
        }
    }
    dispose(window.document.body, []);
    dispose(window.document, []);
    dispose(window, []);
    window.disposeAll = null;
    window.dispose = null;
    window.onunload = null;
}

function dispose(something, map) {
    if (something == null) return;
    if (something.dispose && typeof (something.dispose) == 'function') {
        try { something.dispose(); } catch (e) { debugger; }
    }
    map.push(something);
    for (var key in something) {
        var value = null;
        try { value = something[key]; } catch (e) { };
        if (value == null || value == dispose || value == disposeAll) continue;

        var processed = null;
        for (var index = 0; index < map.length; index++) {
            if (map[index] === value) {
                processed = value;
                break;
            }
        }
        if (processed != null) continue;
        var constructor = value.constructor;
        if (constructor == Object || constructor == Array) {
            try { dispose(value, map); } catch (e) { debugger; }
        }
        if (constructor == Object || constructor == Array || constructor == Function) {
            try { something[key] = null; } catch (e) { debugger; }
        }
    }
    map.pop();
}

(function() {
    var previousUnloadHandler = window.onunload;
    if (previousUnloadHandler == null) {
        window.onunload = disposeAll;
    } else {
        window.onunload = function() {
            previousUnloadHandler.apply(this, arguments); // <== HERE YOU MAY WANT TO HAVE AN "IF" TO MAKE SURE THE ORIGINAL UNLOAD EVENT WASN'T CANCELLED
            disposeAll();
            previousUnloadHandler = null;
        };
    }
}());

</script>
<![endif]-->

Você pode querer remover todo "Debugger". Declarações se você não tiver vontade de lidar com algumas exceções ocasionais.

Você está vazando memória de funções Java?

Aqui está uma solução:Pegue seu java homebrew e jogue-o fora.Use uma das estruturas javascript padrão, como jQuery.

Se você usa javascript complexo e não é um guru de java, não faça isso sozinho.

Editar:O que, isso é um mau conselho?Javascript não é apenas uma linguagem de script simples;é uma linguagem de programação complexa e surpreendentemente poderosa que está intimamente ligada ao HTML DOM, que é implementado de forma diferente em diferentes navegadores.Se você fizer isso errado, não apenas vazará memória, mas também lançará erros em todos os lugares e geralmente tornará a experiência de navegação horrível.Você quer afastar as pessoas que acessam seu site?Não?Em seguida, use uma estrutura javascript e livre-se de todas as besteiras hackeadas entre navegadores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top