Análisis del uso de memoria en compilaciones de versión (C#, Visual Basic, C++, F#)
La herramienta Uso de memoria supervisa el uso de memoria de la aplicación. Puede usar la herramienta para estudiar los efectos de memoria en tiempo real de los escenarios que está desarrollando activamente en Visual Studio. Puede tomar instantáneas detalladas de los estados de memoria de la aplicación y comparar instantáneas para buscar las causas principales de problemas de memoria. La herramienta Uso de memoria se admite en aplicaciones de .NET, ASP.NET, C++o modo mixto (.NET y nativo).
La herramienta Uso de memoria se puede ejecutar en compilaciones de versión o depuración. En este artículo, mostramos cómo usar la herramienta Uso de memoria en Visual Studio Generador de perfiles de rendimiento, que se recomienda para las compilaciones de versión. Para obtener información sobre cómo elegir la mejor herramienta de análisis de memoria para sus necesidades, consulte Elegir una herramienta de análisis de memoria.
Para obtener la mejor experiencia con esta documentación, elija el lenguaje de desarrollo o el entorno de ejecución preferidos en la lista de la parte superior del artículo.
Sesiones de diagnóstico de uso de memoria
Para iniciar una sesión de diagnóstico de uso de memoria:
Abra un proyecto en Visual Studio.
La herramienta Uso de memoria admite aplicaciones de .NET, ASP.NET, C++o modo mixto (.NET y nativo).
En el menú Depurar, establezca la configuración de la solución en Versión y seleccione Depurador local de Windows (o Equipo local) como el destino de implementación.
En la barra de menús, seleccione Depurar>Generador de perfiles de rendimiento.
En Herramientas disponibles, seleccione Uso de memoria y después Iniciar.
Supervisión del uso de memoria
Al iniciar una sesión de diagnóstico, se inicia la aplicación y la ventana Herramientas de diagnóstico muestra un gráfico de escala de tiempo del uso de memoria de la aplicación.
El gráfico de escala de tiempo muestra las fluctuaciones de memoria a medida que se ejecuta la aplicación. Los picos del gráfico suelen indicar que algún código recopila o crea datos y, a continuación, lo descarta cuando se realiza el procesamiento. Los picos grandes indican áreas que puede optimizar. La principal preocupación es un aumento del consumo de memoria que no se devuelve. Esto puede indicar un uso ineficaz de memoria o incluso una pérdida de memoria.
Tomar instantáneas de estados de memoria de la aplicación
Una aplicación usa un gran número de objetos y es posible que quiera concentrar el análisis en un escenario. O bien, es posible que encuentre problemas de memoria para investigar. Puede tomar instantáneas durante una sesión de diagnóstico para capturar el uso de memoria en momentos concretos. Es bueno obtener una instantánea de línea base de una aplicación antes de que aparezca un problema de memoria. Puede tomar otra instantánea después de la primera aparición del problema y otras adicionales si puede repetir el escenario.
Para recopilar instantáneas, elija Tomar instantánea cuando quiera capturar los datos de memoria.
Cierre la sesión de diagnóstico
Para detener una sesión de supervisión sin crear un informe, cierre la ventana de diagnóstico. Para generar un informe cuando haya terminado de recopilar o haber tomado instantáneas, seleccione Detener recopilación.
Si tiene problemas para recopilar o mostrar datos, consulte Solución de problemas de generación de perfiles y corrección de problemas.
Informes de uso de memoria
Después de detener la recopilación de datos, la herramienta Uso de Memoria detiene la aplicación y muestra la página de resumen Uso de Memoria.
Instantáneas de uso de memoria
Los números de los paneles Instantánea muestran los bytes y objetos en memoria cuando se ha tomado cada instantánea y la diferencia entre la instantánea y la anterior.
Los números son vínculos que abren vistas de informes de Uso de memoria detalladas en nuevas ventanas de Visual Studio. Un informe detallado de instantánea muestra los tipos y las instancias en una instantánea. Un informe de diferencias de instantáneas (diff) compara los tipos y las instancias en las dos instantáneas.
Para C++, la columna Objects (Diff) se denomina Allocations (Diff).
Imagen | Descripción |
---|---|
![]() |
Número total de objetos en memoria cuando se tomó la instantánea. Haga clic en este vínculo para mostrar un informe de detalles de instantánea ordenado por el recuento de instancias de los tipos. |
![]() |
Diferencia entre el número total de objetos de memoria de esta instantánea y la instantánea anterior. Haga clic en este vínculo para mostrar un informe diferencial de instantánea ordenado por la diferencia en cuanto al recuento total de instancias de los tipos. |
![]() |
Número total de bytes en memoria cuando se tomó la instantánea. Haga clic en este vínculo para mostrar un informe de detalles de instantánea ordenado por el tamaño total de las instancias de tipo. |
![]() |
Diferencia entre el tamaño total de los objetos de memoria de esta instantánea y la instantánea anterior. Un número positivo significa que el tamaño de memoria de esta instantánea es mayor que el anterior y un número negativo significa que el tamaño es menor. Línea base significa que una instantánea es la primera de una sesión de diagnóstico. Ninguna diferencia significa que la diferencia es cero. Haga clic en este vínculo para mostrar un informe diferencial de instantánea ordenado por la diferencia en cuanto al tamaño total de instancias de los tipos. |
Imagen | Descripción |
---|---|
![]() |
Número total de bytes en memoria cuando se tomó la instantánea. Haga clic en este vínculo para mostrar un informe de detalles de instantánea ordenado por el tamaño total de las instancias de tipo. |
![]() |
Número total de objetos en memoria cuando se tomó la instantánea. Haga clic en este vínculo para mostrar un informe de detalles de instantánea ordenado por el recuento de instancias de los tipos. |
![]() |
Diferencia entre el tamaño total de los objetos de memoria de esta instantánea y la instantánea anterior. Un número positivo significa que el tamaño de memoria de esta instantánea es mayor que el anterior y un número negativo significa que el tamaño es menor. Línea base significa que una instantánea es la primera de una sesión de diagnóstico. Ninguna diferencia significa que la diferencia es cero. Haga clic en este vínculo para mostrar un informe diferencial de instantánea ordenado por la diferencia en cuanto al tamaño total de instancias de los tipos. |
![]() |
Diferencia entre el número total de objetos de memoria de esta instantánea y la instantánea anterior. Seleccione este vínculo para mostrar un informe de diferencias de instantánea. Se ordena por la diferencia en el recuento total de instancias de los tipos. |
Informes de tipos administrados
Elija el vínculo actual de la celda Objects (diferencias) en la tabla resumen de Uso de memoria.
Nota
En el caso del código .NET, el icono Ver instancias () está disponible únicamente al utilizar la herramienta integrada del depurador para el uso de memoria o cuando se abre una instantánea del heap y se elige Depurar memoria administrada .
En el panel superior se muestra el recuento y el tamaño de los tipos de la instantánea, así como el tamaño de todos los objetos a los que hace referencia el tipo (Tamaño inclusivo).
El árbol Rutas de acceso a la raíz del panel inferior muestra los objetos que hacen referencia al tipo seleccionado en el panel superior. El recolector de basura de .NET limpia la memoria de un objeto solo cuando el último tipo que hace referencia a él ha sido liberado. Para obtener más información sobre el uso del árbol Rutas a la raíz, consulte Análisis de la ruta de acceso activa a la raíz.
El panel superior muestra el número y el tamaño de los tipos en la instantánea, incluido el tamaño de todos los objetos a los que hace referencia el tipo (Tamaño inclusivo).
El árbol Rutas de acceso a la raíz del panel inferior muestra los objetos que hacen referencia al tipo seleccionado en el panel superior. El recolector de elementos no utilizados de .NET limpia la memoria de un objeto únicamente si el último tipo que hace referencia a este se ha liberado.
El árbol Tipos a los que se hace referencia muestra las referencias que se incluyen en el tipo seleccionado en el panel superior.
El árbol Tipos a los que se hace referencia muestra las referencias que se incluyen en el tipo seleccionado en el panel superior.
Filtros de árbol de informes
Muchos tipos de aplicaciones no son necesarios para que los desarrolladores de aplicaciones investiguen problemas de memoria. Los filtros de informe de instantánea pueden ocultar la mayoría de estos tipos en los árboles Memoria administrada y Rutas de acceso a la raíz.
Para filtrar un árbol por nombre de tipo, escriba el nombre en el cuadro Filtro. El filtro no distingue mayúsculas de minúsculas y reconoce la cadena especificada en cualquier parte del nombre de tipo.
seleccione Mostrar solo mi código en la lista desplegable Filtro para ocultar la mayoría de las instancias generadas por código externo. Los tipos externos pertenecen al sistema operativo o a los componentes del marco, o los genera el compilador.
Seleccione Contraer pequeños objetos en la lista desplegable Filtro para ocultar aquellos tipos cuyo Tamaño (Bytes) es inferior al 0,5 por ciento de la memoria total.
Informes de tipos nativos
Elija el vínculo actual de una celda Asignaciones (dif.) o Tamaño de montón (dif.) en la tabla de resumen Uso de memoria de la ventana Herramientas de diagnóstico.
La vista de tipos muestra el número y el tamaño de los tipos en la instantánea.
Elija el icono Ver instancias junto a un tipo seleccionado para mostrar información sobre los objetos del tipo seleccionado en la instantánea.
La vista de instancias muestra cada instancia del tipo seleccionado. Al seleccionar una instancia se muestra la pila de llamadas que produjo la creación de la instancia en el panel Pila de llamadas de asignación. Esta información solo está disponible durante la depuración.
Elija el icono de instancias (
) de un tipo seleccionado para mostrar información sobre los objetos del tipo seleccionado en la instantánea.
La vista Instancias muestra cada instancia del tipo seleccionado. Al seleccionar una instancia se muestra la pila de llamadas que produjo la creación de la instancia en el panel Pila de llamadas de asignación.
Elija Vista de pilas en la lista Modo de vista para ver la pila de asignación del tipo seleccionado.
Información de uso de memoria
Para la memoria administrada, la herramienta Análisis de memoria también proporciona varias conclusiones automáticas integradas eficaces. Seleccione la pestaña Información en los informes de tipos administrados y se mostrará la información automática aplicable, como Cadenas duplicadas, Matrices dispersas y Pérdidas del controlador de eventos.
La sección Cadenas duplicadas muestra la lista de cadenas que se asignan varias veces en el montón. Además, en esta sección se muestra el total de memoria desperdiciada, es decir, el (número de instancias - 1) por el tamaño de la cadena.
La sección matrices dispersas muestra matrices que se rellenan principalmente con cero elementos, lo que puede ser ineficaz en términos de rendimiento y uso de memoria. La herramienta de análisis de memoria detectará automáticamente estas matrices y mostrará la cantidad de memoria que se está desperdiciando debido a estos valores cero.
La sección Event Handler Leaks, disponible en la versión preliminar 17.9 de Visual Studio 2022, muestra posibles fugas de memoria que pueden ocurrir cuando un objeto se suscribe al evento de otro. Si el publicador del evento sobrevive al suscriptor, el suscriptor permanece activo, incluso si no hay otras referencias a él. Esto puede provocar pérdidas de memoria, donde la memoria no utilizada no está libre correctamente, lo que hace que la aplicación use más y más memoria a lo largo del tiempo.
Se sabe que ciertos tipos tienen campos que se pueden leer para determinar el tamaño de la memoria nativa en la que se encuentran. En la pestaña Insights se muestran nodos de memoria nativa falsos en el gráfico de objetos, que sus objetos primarios conservan para que la interfaz de usuario los reconozca y muestre su tamaño y gráfico de referencia.
Informes de cambios (diferencias)
Elija el vínculo cambiar en una celda del panel de Instantáneas en la página de la información general del uso de memoria.
Elija una instantánea de la lista Comparar con en un informe administrado o nativo.
El informe de cambios añade columnas (que están marcadas con (diferencias)) al informe base, las cuales muestran la diferencia entre el valor de la captura base y la de comparación. Este es el aspecto de un informe de diferencias de la vista de tipo nativo:
El panel superior muestra el número y el tamaño de los tipos en la instantánea, incluido el tamaño de todos los objetos a los que hace referencia el tipo (Tamaño inclusivo).