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
Respuesta
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:
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.
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. –
@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. –
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 :)
No tiene que encontrarles sentido, son errores en broswers y se corrigen de versiones a versiones.
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. –
- 1. Fugas de memoria con UIWebView y Javascript
- 2. memoria riesgo de fugas en JavaScript cierres
- 3. Objetos de la vida de JavaScript y fugas de memoria
- 4. cómo encontrar fugas de memoria en javascript
- 5. descargar una copia local de trabajo de una página web
- 6. Cómo descargar una página web en php
- 7. Fugas de memoria WPF
- 8. Fugas de memoria detectadas
- 9. Fugas de memoria después de utilizar typeinfo :: name()
- 10. Descargar CSS de la página web
- 11. Prevención de fugas de memoria AJAX
- 12. Fugas de memoria de Python
- 13. Fugas de memoria en .NET
- 14. Fugas de memoria usando socket.io
- 15. ¿Encontrar fugas de memoria en JavaScript usando firebug?
- 16. ¿Cómo evitar fugas de memoria?
- 17. Java Memoria Asignación Fugas
- 18. Fugas de memoria de prueba unitaria
- 19. memoria CGContextDrawPDFPage fugas
- 20. memoria Valgrind C++ fugas
- 21. Código C más rápido para descargar una página web
- 22. Evitar fugas de memoria en el dojo?
- 23. Fugas de memoria en C# WPF
- 24. Fugas de memoria causadas por CoreFoundation Framework
- 25. Descargar applet de java de la página web
- 26. Detectores de fugas de memoria para C?
- 27. ¿Cómo rastrear y depurar fugas de memoria de JavaScript en Firefox?
- 28. Fugas de memoria de CDialog en VC10
- 29. Depuración de fugas de memoria FLEX/AS3
- 30. Fugas de memoria - conjuntos de STL
exactamente por qué tienen fugas :) La memoria no se puede recuperar. –