2009-10-05 12 views
22

Sé que Javascript tiene un recolector de basura. Por lo tanto, utilizando , elimine, elimine solo una referencia al objeto, y cuando no haya más referencias a este objeto, será eliminado por el GC.Errores de gestión de memoria Javascript?

Javascript es complicado, con los cierres, el espacio de nombres difusos y la herencia del prototipo, no siempre es obvio saber cuándo o por qué.

Estoy codificando un proyecto Javascript bastante grande y me gustaría evitar la pérdida de memoria, al tiempo que limito el uso de la memoria global. No estoy en absoluto en la etapa de optimización (vamos a hacer que las cosas funcionen primero :-)), pero sería bueno conocer las buenas prácticas para la administración de la memoria a fin de evitar escribir códigos maliciosos.

  • ¿Cuándo debo usar borrar?
  • ¿Cuáles son las trampas que debo evitar, usando objetos?
  • ¿Hay algo que debe saber sobre los cierres?
  • ¿Algunas buenas prácticas para resaltar?
+0

¿Existe tal vez un error tipográfico en el que tenga que saber cuándo ** ahora ** o por qué? No puedo analizar este fragmento de inglés ... – hippietrail

+0

No me entiendo a mí mismo. Tal vez estaba borracho o simplemente me desperté cuando escribí eso. O ambos. Solo ignoralo. –

Respuesta

3

Creo que al almacenar datos en los nodos DOM puede crear fácilmente referencias circulares que no todos los navegadores pueden manejar. Por ejemplo:

this.element = document.getElementById('something'); 
this.element.attachedObject = this; 
5
  • En IE, al menos en las versiones anteriores, un elemento DOM se mantiene en la memoria después de quitar usando removeChild si tuviera un detector de eventos adjunto. La única forma de eliminarlo de la memoria era separar el evento antes de eliminarlo del DOM.
  • Siempre y cuando no cree y elimine elementos con frecuencia, no debe preocuparse por esto. Si crea muchos elementos cuando se inicia la aplicación, pero no crea nuevos objetos después de eso, entonces no se preocupe demasiado por las pérdidas de memoria.
10

Según mi experiencia, los Recolectores de basura están bien/mal implementados según el navegador. La aplicación de buenas prácticas de programación orientadas a objetos es un buen comienzo.

Mi único consejo: no crean pérdidas de memoria mediante la conexión de DOM & Javascript objetos (referencias circulares que no se borrará por DOM y JS GC). Estos errores consumirán mucha más memoria que cualquier objeto que creará en su aplicación.

Más detalles sobre las fugas de memoria DOM/JS. http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

+1

Estoy de acuerdo en conectar DOM con objetos js es el mayor problema del que tengo conocimiento. Creo que la mayoría de los navegadores tienen diferentes montones de memoria para objetos DOM y js, respectivamente, por lo que hacer conexiones entre ellos a menudo causa pérdidas de memoria. Otro enlace útil: http://www.ibm.com/developerworks/web/library/wa-memleak/ – Vojta

Cuestiones relacionadas