Investigar problemas de memoria
Objetivos de aprendizaje
Después de completar esta unidad, podrá:
- Usar el panel de memoria para hacer un seguimiento del uso de la memoria.
- Acceder al monitor de desempeño para supervisar el tamaño de la pila de JS y los agentes de escucha de eventos JS.
Bloquear el navegador
El siguiente ejemplo tiene el potencial de bloquear su navegador. Las pérdidas de memoria del navegador del cliente pueden ralentizar la experiencia del navegador al punto de bloquearlo.
Arreglar la inmovilización o el bloqueo del navegador de Chrome
Los ejemplos del componente web Lightning en este módulo pueden hacer que su navegador quede inmovilizado, pero hay una herramienta ingeniosa que se puede utilizar para cerrar una ficha que no responde.
- En la sección de fichas del navegador de Chrome, haga clic con el botón derecho en el área vacÃa y, a continuación, seleccione Task Manager (Administrador de tareas).
- Haga clic sobre un elemento en el Administrador de tareas. El botón End Process (Finalizar proceso) se activa.
- Cierre el Administrador de tareas.
Ahora tenemos una forma de salir de un proceso estancado.
Veamos otro mal ejemplo y la forma de solucionar el problema.
Exceso de agentes de escucha de eventos
- Con la aplicación Bad Network abierta, seleccione Example 2: Count Clicks (Ejemplo 2: Contar clics).
- Haga clic en Click Me (Hacer clic aquÃ) de forma repetida hasta que la respuesta de conteo se ralentice. El conteo es errático y no coincide con la cantidad de clics. El color también cambia. Usemos el monitor de desempeño para investigar.
- Actualice la página.
- En DevTools, haga clic en el Ãcono Customize and control DevTools (Personalizar y controlar DevTools) (
) para expandir el menú y, luego, haga clic en More tools (Más herramientas) > Performance monitor (Monitor de desempeño).
El monitor hace un seguimiento del desempeño en el tiempo. Podemos supervisar los cambios mientras interactuamos con la página.
- Seleccione las opciones JS heap size (Tamaño la de pila de JS) y JS event listeners (Agentes de escucha de eventos de JS) para ver los resultados.
Observe la cantidad de agentes de escucha de eventos de JS. Es posible que los gráficos demoren en mostrar los cambios en la página. Preste atención al uso de la CPU, el tamaño de la pila de JS, los nodos DOM y los agentes de escucha de eventos de JS mientras continuamos.
- Haga clic en Click Me (Hacer clic aquÃ) varias veces y observe que el uso de la CPU se mantiene bajo. Los nodos DOM también se mantienen bajos. Sin embargo, el tamaño de la pila de JS y los agentes de escucha de eventos de JS crecen considerablemente.
Analicemos la información que brinda DevTools para colaborar con el seguimiento del tamaño de la pila de JS.
Usar el panel de memoria
- Cierre el monitor de desempeño.
- En el menú DevTools, seleccione la ficha Memory (Memoria).
- Actualice la página para comenzar con un ejemplo nuevo.
Esto le permite capturar la lÃnea base de comparación en una instantánea. - En el panel Memory (Memoria), haga clic en Take snapshot (Tomar instantánea).
- Espere que se cree la instantánea y que aparezca. (Esto puede tardar unos minutos, según la velocidad de su navegador).
- Haga clic en Click Me (Hacer clic aquÃ) hasta que se ralentice, como hizo antes.
- Seleccione el encabezado Profiles (Perfiles) y haga clic en Take snapshot (Tomar instantánea) para crear una instantánea nueva.
- Espere que se cree la instantánea. Se mostrará debajo de la primera instantánea. El tamaño aumentó 20.5 MB de la Instantánea 1 (95.5 MB) a la Instantánea 2 (116 MB). Es posible que el tamaño de sus instantáneas sea distinto.
Comparación de las dos instantáneas
- En el menú Memory (Memoria), en la lista de perspectivas (configurada en Summary [Resumen]), seleccione Comparison (Comparación).
De forma predeterminada, Chrome compara la instantánea anterior, pero puede realizar la comparación con una instantánea diferente. Para ello, debe seleccionarla en el menú desplegable que se encuentra arriba de los datos. Cada fila muestra la diferencia por elemento entre las dos instantáneas.
- Seleccione el encabezado de columna Size Delta (Tamaño delta) para ordenar por tamaño delta. Si hace clic en el encabezado se desplazará por las opciones de clasificación.
- Ordene de mayor a menor.
Desplácese hacia abajo en la columna Constructor (Constructor) y observe que la mayorÃa son elementos de sistema antes del constuctor SomeObj. En este caso, se crearon 6142 elementos SomeObjs. ¡Es un montón!
- Expanda SomeObj para abrirlo y ver todas sus instancias.
El constructor JavaScript de SomeObj en la memoria está enumerado para cada instancia de SomeObj. En este caso, es el archivo example2_CountClicks.js de la lÃnea 63.
- Seleccione un elemento SomeObj para ver sus detalles en el panel Object (Objeto). (Ese panel está debajo del panel Constructor [Constructor] y el panel Retainers [Retenedores]).
En los detalles del panel Object (Objeto), en la segunda lÃnea, el primer contexto muestra el archivo y la ubicación de la llamada para generar el objeto example2_CountClicks.js en la lÃnea 81.
- Haga clic en el vÃnculo example2_CountClicks.js para abrir el archivo en el panel Sources (Fuentes).
La lÃnea 81 se encuentra en el método listenForEvent, que crea una instancia nueva de SomeObj y luego la utiliza en addEventListener para un evento de clic. Por lo tanto, cada vez que el cuerpo recibe un clic, se agrega otro EventListener para el evento de clic en el cuerpo. El problema es que los agentes de escucha nunca se limpian y esto crea una pérdida de memoria.
También puede ver los elementos EventListeners en la ficha Elements (Elementos).
- Seleccione la ficha Elements (Elementos).
- Seleccione la etiqueta body y, a continuación, seleccione Event Listeners (Agentes de escucha de eventos).
- Expanda el evento click (clic).
Estos son todos los agentes de escucha (en el cuerpo) que se agregaron mediante todos los clics. Esta es una pérdida de memoria clásica. Puede hacer que el navegador se ralentice y se bloquee.
Tenga cuidado cuando agregue agentes de escucha de eventos. Limpiar los agentes de escucha adecuadamente es parte de crear buenos componentes web Lightning. Consulte la sección Resources para obtener más información sobre los eventos y los agentes de escucha.
Ahora ya sabe cómo usar algunas de las herramientas de desarrollador que se encuentran disponibles en los navegadores web. UtilÃcelas para investigar los problemas de red y de memoria cuando solucione problemas de los componentes web Lightning.
Recursos
- Documentos web MDN: EventTarget.addEventListener()
- GuÃa para desarrolladores de componentes web Lightning: Ejecutar un código cuando un componente se representa
- GuÃa para desarrolladores de componentes web Lightning: Crear y despachar eventos
- GuÃa para desarrolladores de componentes web Lightning: Acceder a elementos del componente