2012-08-15 9 views
16

Tengo una aplicación web que tiene una pérdida de memoria en algún lugar y no puedo detectarla. Ya probé las herramientas para desarrolladores de Chrome, que normalmente funcionan estupendamente, pero no puedo rastrear las líneas de código que son responsables. Las herramientas de Chrome me dan demasiada información y no puedo relacionar los objetos en la memoria con mi código.Herramienta para rastrear la pérdida de memoria de JavaScript

¿Hay alguna otra herramienta que pueda ser útil?

+0

posible duplicado de [Herramientas para la depuración de las pérdidas de memoria en JavaScript] (http://stackoverflow.com/questions/3573252/tools-for-debugging-memory-leaks-in-javascript) –

Respuesta

22

actualización: Permite utilizar Record Montón Asignaciones tipo perfil.

  1. devtools Open Profiler
  2. hacer una acción de calentamiento
  3. perfilador inicio
  4. acción
  5. repita un par de veces
  6. si la acción tiene una fuga verá el mismo número de grupos de azul barras en el panel de información general
  7. detener el generador de perfiles
  8. seleccionar un grupo de estas barras azules en la vista general
  9. mire en la lista de objetos

Ver screencast Javascript Memory Leak detection (Chrome DevTools)

fue: Usted puede utilizar el siguiente escenario de refinación pérdidas de memoria.

  1. devtools Open Profiler
  2. hacer una acción que hace que una fuga
  3. tomar una instantánea montón
  4. repita los pasos 2 y 3 árboles tiempos
  5. seleccionar la última instantánea montón
  6. cambio de filtro " Todos los objetos "a" Objetos entre la instantánea 1 y 2 "

Después de eso usted veremos objetos un conjunto de objetos filtrados. Puede seleccionar un objeto y ver la lista de retenedores en el árbol de retención de Object

+3

¿Cómo rastreas un retenedor a tu código? – thecountofzero

+0

Por lo general, usted sabe quién agrega los objetos filtrados a un contenedor porque es su código. Pero si no lo sabe, puede anular el constructor con uno nuevo para la clase de objeto filtrada que registra el seguimiento de la pila y llama al original, directamente desde la consola. Repita estos pasos y observe el objeto para el seguimiento de la pila de asignación. Podría darle una pista de cuál fue la fuente del objeto filtrado y qué código debería eliminar la última reverencia al objeto filtrado. – loislo

2

Utilice los valores innerHTML y outerHTML del elemento en la vista Detached DOM tree del Heap Profiler para asignar objetos en la memoria a su código y rastrear las pérdidas de memoria.

+0

jQuery peticiones Ajax fue el El mayor culpable en mi aplicación. Ubique todas sus funciones de jQuery ajax: .ajax(), .get(), .post() y setters de contenido: .html(), .text(). Vaya a la pestaña de red en las herramientas de desarrollo, actualice la página actual de 10 a 20 veces. Resolví una pérdida de memoria reciente con jQuery.load() dentro de mi aplicación JS de una página ... 'if (! JQuery.terms_html) \t \t \t $ ('# tc_container'). Load (STATIC_DOMAIN + '/ terms. html', function() { \t \t \t \t jQuery.terms_html = $ ('# tc_container'). html() \t \t \t}) \t \t demás \t \t \t $ ('# tc_container'). html (jQuery.terms_html) ' –

0

jQuery ajax fue el principal culpable de mi aplicación. Ubique todas sus funciones de jQuery ajax: .ajax(), .get(), .post() y setters de contenido: .html(), .text().

Vaya a la pestaña de red en las herramientas de desarrollo, actualice la página actual de 10 a 20 veces. Si ve cosas que se acumulan con demasiada frecuencia, o si no se completan las llamadas, tiene una pérdida de memoria.

Aquí hay una pérdida de memoria reciente que pude resolver con jQuery.load() ...

if(!jQuery.terms_html) $('#tc_container').load(STATIC_DOMAIN + '/terms.html', function() { jQuery.terms_html = $('#tc_container').html() }) else $('#tc_container').html(jQuery.terms_html)

Además, la última versión de jQuery en el momento de escribir esto es 3.3.1. Tener la última versión instalada es la mejor manera de comenzar, si es posible. https://github.com/jquery/jquery/releases

Cuestiones relacionadas