2011-03-03 18 views
8

Llamo a una función 50 veces por segundo, lo cual hace algunas cosas costosas ya que está pintando mucho en un elemento <canvas>.Fuga de memoria en JavaScript (Chrome)

Funciona muy bien, no hay problemas allí, pero solo eché un vistazo al uso de la memoria y me estaba robando 1MB por segundo de mi memoria RAM. Chrome parece recolectar basura, ya que disminuyó cada minuto más o menos, pero luego el uso volvió a crecer.

Lo que probé es poner return en ciertos lugares en mi función para decidir qué parte de mi función causa exactamente la fuga. Pude reducirlo a una línea específica de código, después de lo cual aparece la parte malvada, pero realmente no sé cómo resolverla.

Mis preguntas son:

  • Qué herramienta está disponible para medir de manera eficaz las pérdidas de memoria de JavaScript en Chrome?
  • ¿Sería eficaz establecer las variables a null/undefined después de que se hayan utilizado, algo así como deshacerse de ellas?

Si el código fuente es realmente necesario, no dudaría en publicarlo aquí, pero debo admitir que es largo y tal vez algo incomprensible para otros.

Respuesta

9

Voy a extraer esta cita directamente, vinculada desde el artículo;

Hablando de fugas de memoria, la ruptura de referencias circulares, la causa de las fugas, generalmente se realiza con una simple asignación nula. Por lo general, no es necesario utilizar eliminar. Además, la anulación permite "eliminar la referencia" de variables, lo que la eliminación normalmente no sería capaz de hacer.

var el = document.getElementById('foo'); 
// circular reference is formed 
el.onclick = function() { /* ... */ }; 
// circular reference is broken 
el = null; 
// can't `delete el` in this case, as `el` has DontDelete 

Por estas razones, es mejor seguir con null'ing al romper las referencias circulares.

delete Explained

+0

En realidad, no tengo referencias circulares. Son todas las clases 'Vector' personalizadas que representan puntos en 3D y 2D en mi función de renderizador. Supongo que se acumulan en la memoria si llamo a la función 50 veces por segundo. ¿Seguir anulando aún ayuda? He estado experimentando en vano en este momento, ambos usando 'delete' y' = null'. – pimvdb

+0

@pimvdb Lea el artículo, es bastante extenso pero muy completo para mostrar cómo funciona realmente la eliminación. No podría decir si alguna de las opciones sería exitosa para usted. js fugas son siempre un b ** ch. – Andrew

3

Mire el perfil de pila en la pestaña Perfiles en las herramientas de desarrollador de Chrome para obtener información sobre el uso de la memoria.

Usted puede hacer lo siguiente para evitar pérdidas de memoria:

  • a prueba tu código con JSLint, para ver si eso le dará algunos consejos.
  • Utilice la palabra clave var para dar a su variable el alcance de la función, por lo que pueden ser recogidos cuando salen del alcance. Sin las variables de palabras clave var tienen alcance global.
  • Utilice las declaraciones delete variable; para eliminar el objeto así como la referencia de la memoria. Establecer la variable a nulo solo eliminará el objeto de la memoria, pero no su referencia.
+0

Gracias. ¿Sabes quizás si la variable for loop (por ejemplo, 'i') se eliminará automáticamente después de que termine el ciclo for? – pimvdb

+4

@pimvdb: no lo hará, ya que solo las funciones definen el alcance en javascript. Lea más sobre el alcance de Javascript aquí: http: //www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting –