2009-07-03 19 views
8

He estado leyendo para tratar de dar sentido a las pérdidas de memoria en los navegadores, esp. ES DECIR. Entiendo que las filtraciones son causadas por una falta de coincidencia en los algoritmos de recolección de basura entre el motor de Javascript y el árbol de objetos DOM, y persistirán. Lo que no entiendo es por qué (de acuerdo con algunas declaraciones en los artículos que estoy leyendo) la memoria no se recupera después de que el navegador descarga la página. Navegar fuera de una página web debería poner todos los objetos DOM y javascript fuera del alcance en ese momento, ¿no es así?Fugas de memoria Javascript después de descargar una página web

+0

exactamente por qué tienen fugas :) La memoria no se puede recuperar. –

Respuesta

8

Aquí está el problema. IE tiene un recolector de basura por separado para el DOM y para javascript. No pueden detectar referencias circulares entre los dos.

Lo que solíamos hacer era limpiar todos los controladores de eventos de todos los nodos en la descarga de la página. Sin embargo, esto podría detener el navegador mientras se descarga. Esto solo abordó el caso donde la referencia circular fue causada por manejadores de eventos. También podría ser causado por la adición de referencias directas de los nodos DOM a los objetos js que tenían una referencia al nodo DOM en sí.

Otra cosa buena para recordar es que si está eliminando nodos, es una buena idea eliminar primero los manejadores. Ext-js tiene un método Ext.destroy que hace justamente eso (si ha configurado los controladores usando ext).

Ejemplo

// Leaky code to wrap HTML elements that allows you to find the custom js object by adding 
//a reference as an "expando" property 
function El(node) { 
    this.dom = node; 
    node.el = this; 
} 

A continuación, Microsoft IE hackeado por lo que elimina todos los controladores de eventos y propiedades expando cuando se descarga internamente, por lo tanto, es mucho más rápido que hacerlo con js. Esta corrección parece solucionar nuestros problemas de memoria, pero no todos los problemas, ya que todavía hay personas que tienen el problema.

MS's description of the problem

MS releases patch that "fixes" memory leaks:

Blog about fixed memory leaks

IE still has some problems

En nuestra empresa, utilizamos ext-js. Al establecer siempre controladores de eventos utilizando ext-js, que tiene una rutina de limpieza interna, no hemos experimentado pérdidas de memoria. En realidad, el uso de la memoria crece pero se detiene en aproximadamente 250 Mb para una máquina con 4 GB de RAM. No creemos que sea demasiado malo ya que cargamos aproximadamente 2Mb (sin comprimir) de archivos js y todos los elementos en la página son dinámicos.

Hay mucho que decir al respecto y lo hemos investigado extensamente donde trabajo. Siéntase libre de hacer una pregunta más específica. Es posible que pueda ayudarte.

+0

Gracias por su investigación, ¿IE9 ha mejorado en absoluto? Estamos experimentando pérdidas simplemente configurando la propiedad innerHTML, los clientes se están ejecutando en VMWARE y la memoria se está filtrando rápidamente. Pedir a los usuarios de la intranet que vuelvan a abrir la aplicación no es la solución, pero no tenemos otra opción. –

+1

@AlexanderN Si está experimentando un aumento de la memoria al configurar 'innerHTML', es muy probable que cree pérdidas al eliminar los nodos del DOM sin separar los manejadores que estaban adjuntos a ellos. Nunca debe sobrescribir 'innerHTML' sin eliminar primero los controladores. Eso vale para cualquier navegador. –

3

Lo mejor que he leído sobre Javascript memory leaks fue escrito por Doulgas Crockford.

Para responder a su pregunta, sí, el navegador absolutamente debe descargar todos los objetos (y lo más importante, controladores de eventos) en el momento adecuado. Si lo hiciera, no tendría filtraciones :)

0

No tiene que encontrarles sentido, son errores en broswers y se corrigen de versiones a versiones.

+0

El hecho de que una versión se solucione no descarta el error; las versiones anteriores del navegador permanecerán en uso a menos que pueda obtener la actualización de todos sus clientes. Al hacer desarrollo web, entender cómo funciona el navegador es increíblemente importante. –