memory leaks - node - Gran aplicación web con pérdida de memoria en IE 6
liberar memoria node js (4)
Tengo una gran aplicación web que está teniendo problemas con la pérdida de memoria en IE 6.
Reparar una fuga de memoria en un ejemplo de código de 5 líneas que demuestra el problema es fácil.
Pero si tengo una aplicación muy grande, ¿de dónde debería comenzar?
¿Estás perdiendo memoria de las funciones de Java?
Aquí hay una solución: toma tu java casera y métetela. Utilice uno de los marcos de JavaScript estándar, como jQuery.
Si está haciendo javascript complejo y no es un java guru, no lo haga usted mismo.
Editar: ¿Qué, es ese mal consejo? Javascript no es solo un lenguaje de scripting simple; es un lenguaje de programación complejo y sorprendentemente poderoso que está estrechamente relacionado con el HTML DOM, que se implementa de manera diferente en diferentes navegadores. Si lo haces mal, no solo perderás memoria, sino que también arrojarás errores en todas partes y, por lo general, harás que la experiencia de navegación sea horrible. ¿Quieres alejar a las personas que ingresan a tu sitio web? ¿No? A continuación, utilice un marco de JavaScript y deshacerse de todos sus hacky bullshittery cross-browser.
¿La aplicación usa mucho JavaScript?
Si lo hace, entonces una cosa que he encontrado que ayuda a evitar fugas de memoria es asegurarse de que está utilizando un marco de JavaScript como Prototype o jQuery porque han probado y probado el código de manejo de eventos que no pierde memoria.
- IE6 también puede perder memoria si tiene referencias circulares a objetos DOM
- Pruebe también este Detector de fugas de memoria JavaScript y vea si puede diagnosticar dónde está el problema
Aquí es cómo resolví el problema de pérdida de memoria en IE7. La idea es eliminar / configurar para anular todas las propiedades de expansión en todos los nodos DOM al descargar la página. Esto funcionó para mí. Lo podrías encontrar ú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]-->
Es posible que desee eliminar todo el "depurador"; declaraciones si no tiene ganas de lidiar con algunas excepciones ocasionales.
Echa un vistazo a Drip . Eso generalmente elimina las conjeturas de las pérdidas de memoria de IE.
Si por alguna razón, Drip no lo encuentra, eche un vistazo de cerca a cualquier código JavaScript que funcione con eventos. Esa es casi siempre la fuente de cualquier fuga de memoria significativa en un navegador.
Destruir un elemento DOM con manejadores conectados a él, sin eliminar primero esos manejadores, evitará que se recupere la memoria asociada con esos manejadores.