Enorme aplicativo da Web com vazamento de memória no IE 6
-
09-06-2019 - |
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?
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.
- O IE6 também pode vazar memória se você tiver referências circulares a objetos DOM
- Experimente também isso Detector de vazamento de memória JavaScript e veja se você consegue diagnosticar onde está o problema
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.