El punto de partida es, por supuesto, el Analizador de Memoria de Chrome, que tiene tres opciones de análisis disponibles. Es posible que descubras que la instantánea del heap y el muestreo de asignaciones son las opciones más útiles. Pero para dos propósitos diferentes. La instantánea del heap toma una imagen completa del uso actual de la memoria en un punto dado en el tiempo, proporcionándote un desglose de los tipos de objetos en memoria y por qué se están reteniendo. Usando una instantánea del heap, puedes observar diferentes tipos de objetos, su uso de memoria superficial, y su uso de memoria retenida como dijimos antes.
Con cualquier instantánea, sin embargo, te falta información sobre lo que está cambiando con el tiempo y no puedes observar los picos transitorios de uso de memoria. Si estás interesado en los picos de uso de memoria, puedes utilizar el método de muestreo de asignaciones. Puedes iniciarlo y detenerlo más tarde y después de ejecutarlo durante algún tiempo, te proporciona un gráfico, describiendo cuánto se asignó durante el tiempo y por qué funciones. Esta es una herramienta realmente poderosa para depurar picos de uso de memoria, pero es menos adecuada para analizar la huella de memoria total de tu aplicación en un estado estable. Y solo usando estas dos herramientas, puedes hacer optimizaciones de uso de memoria realmente poderosas.
Por ejemplo, puedo mostrarte cómo las usamos para optimizar la actualización y el trabajo. Después de tomar una instantánea de memoria de la aplicación Flux en un estado estable, podemos hacer clic en las columnas de tamaño superficial y retenido para ordenar los tipos de asignación por uso de memoria y con suerte encontrar los mayores infractores y eliminarlos. Podemos verificar ambos, tanto retenido como superficial, para que podamos encontrar tanto asignaciones individuales grandes como ubicaciones más pequeñas que están reteniendo una gran cantidad de memoria. Y mientras mirábamos esa lista, había algo que destacaba de inmediato.
Tenemos muchos objetos de mapa, alrededor de 10,000, la mayoría de ellos bastante pequeños, pero aparte del primero, que estaba ocupando alrededor de 84 megabytes de RAM. Y eso inmediatamente pareció una gran alerta roja ya que no sabía que teníamos un mapa tan grande para algo en la aplicación. Y en la parte inferior de la interfaz de usuario del perfilador, podemos ver por qué y quién estaba reteniendo ese gran objeto de mapa, que resultó ser una variable global que estábamos utilizando para suscribirnos a eventos. De hecho, cada vez que en nuestra aplicación ocurre una suscripción, estamos utilizando un hook useState para generar y almacenar un UID de cadena, que luego se utilizaba para eliminar la suscripción en CleanApp. Resultó ser extremadamente ineficiente para el consumo de memoria, ya que necesitaba instanciar el hook useState, almacenar la cadena, y también mantener el cierre alrededor de esa función lambda. Y al eliminar esa llamada al hook useState y reemplazar el mapa que mantenía las cadenas solo por una estructura de conjunto data, pudimos reducir la huella de memoria de las suscripciones, lo que ahorró incluso un 50% de RAM en algunos casos. Y este es un ejemplo de una estructura de datos data obviamente ineficiente en memoria, que fue fácil de encontrar y optimizar.
Desafortunadamente, sin embargo, eso no siempre es el caso. De hecho, fue una de las pocas cosas fáciles que pudimos optimizar en nuestra aplicación. Si miras este perfil, puedes ver cómo la mayoría restante de la huella de memoria está dominada por objetos. Y desafortunadamente, ya no tenemos un solo objeto para optimizar, sino más bien dos millones de instancias de objetos más pequeños que se mantienen en memoria. El analizador de memoria de Chrome no facilita la comprensión ya que no agrupa los objetos por tipo. Y no hay forma de que puedas desplazarte manualmente por todos ellos y averiguar qué está pasando. Afortunadamente, sin embargo, el analizador de memoria de Chrome puede exportar tu instantánea del heap a un archivo JSON. Así que hay esperanza para nosotros para realizar algún análisis estadístico sobre ellos. Sin tener que escribir mucho código, un importador y un analizador nosotros mismos, hay una herramienta fantástica para analizar esos archivos llamada Memlab.
Comments