Compartir a través de


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:

  1. Abra un proyecto en Visual Studio.

    La herramienta Uso de memoria admite aplicaciones de .NET, ASP.NET, C++o modo mixto (.NET y nativo).

  2. 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.

  3. En la barra de menús, seleccione Depurar>Generador de perfiles de rendimiento.

  4. En Herramientas disponibles, seleccione Uso de memoria y después Iniciar.

    Iniciar una sesión de diagnóstico de uso de memoria.

    Iniciar una sesión de diagnóstico de uso de memoria.

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.

Captura de pantalla de la ventana Herramientas de diagnóstico del Generador de perfiles de rendimiento de Visual Studio que muestra un gráfico de escala de tiempo del uso de memoria de la aplicación.

Captura de pantalla de la ventana Herramientas de diagnóstico del Generador de perfiles de rendimiento de Visual Studio que muestra un gráfico de escala de tiempo del uso de memoria de la aplicación. Resumen del Informe de Memoria

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.

Captura de pantalla de la toma de una instantánea.

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.

Captura de pantalla de detención de la recopilación.

Captura de pantalla de detención de la 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.

Captura de pantalla de la página de información general de la herramienta Uso de memoria en el Generador de perfiles de rendimiento de Visual Studio, que muestra un gráfico de uso de memoria y dos paneles de instantáneas.

Captura de pantalla de la página de información general de la herramienta Uso de memoria en el Generador de perfiles de rendimiento de Visual Studio, que muestra un gráfico del uso de memoria y dos paneles de instantáneas.

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.

Captura de pantalla de vínculos de vista de instantáneas

Para C++, la columna Objects (Diff) se denomina Allocations (Diff).

Imagen Descripción
paso 1 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.
paso 2 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.
paso 3 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.
Paso 4 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.

Vínculos de vista de instantánea

Imagen Descripción
paso 1 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.
paso 2 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.
paso 3 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.
Paso 4 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.

Captura de pantalla del informe de tipo administrado.Informe de tipo administrado

Nota

En el caso del código .NET, el icono Ver instancias (El icono de instancia en la columna Tipo de objeto) 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.

Captura de pantalla del informe de tipo administrado.

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.

Captura de pantalla del informe Objetos a los que se hace referencia.

El árbol Tipos a los que se hace referencia muestra las referencias que se incluyen en el tipo seleccionado en el panel superior.

Captura de pantalla del informe Objetos a los que se hace referencia.

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.

Opciones de ordenación y filtro

opciones de ordenación y filtro

  • 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.

Captura de pantalla de la vista Tipo nativo.

Captura de pantalla de la vista Tipo nativo.

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.

    Captura de pantalla de la vista Instancias y el panel Pila de llamadas de asignación.

  • Elija el icono de instancias (El icono de instancia de la columna Tipo de objeto) 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.

    Captura de pantalla de la vista Instancias y el panel Pila de llamadas de asignación.

  • Elija Pilas para ver la pila de asignación del tipo seleccionado.

    Captura de pantalla de la vista Pilas.

  • Elija Vista de pilas en la lista Modo de vista para ver la pila de asignación del tipo seleccionado.

    Captura de pantalla de la vista Pilas.

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.

Captura de pantalla de la vista de conclusiones en la herramienta Uso de memoria.

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.

Captura de pantalla de la vista de conclusiones nativa en la herramienta Uso de Memoria.

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.

    Captura de pantalla del vínculo de cambio Elija una en una celda.

    Captura de pantalla del vínculo de cambio Elija una en una celda.

  • Elija una instantánea de la lista Comparar con en un informe administrado o nativo.

    Captura de pantalla de Elija una instantánea en la lista Comparar con.

    Captura de pantalla de la acción de elegir una instantánea en la lista Comparar con.

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:

Captura de pantalla de la vista de diferencias de tipos nativos.

Captura de pantalla de la vista de diferencias de tipos nativos.

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).