Medición del uso de memoria en Visual Studio (C#, Visual Basic, C++, F#)

Busque pérdidas de memoria y memoria ineficaz durante la depuración con la herramienta de diagnóstico Uso de memoria integrada del depurador. La herramienta Uso de memoria permite tomar una o más instantáneas del montón de memoria nativa y administrada para que pueda conocer el impacto del uso de memoria de los tipos de objeto. También puede analizar el uso de memoria sin un depurador asociado o si establece como destino una aplicación en ejecución. Para obtener más información, vea Ejecutar herramientas de generación de perfiles con o sin el depurador. Para obtener información sobre cómo elegir la mejor herramienta de análisis de memoria para sus necesidades, consulte Elección de una herramienta de análisis de memoria.

Aunque puede recopilar instantáneas de memoria en cualquier momento en la herramienta Uso de memoria , puede usar el depurador de Visual Studio para controlar cómo se ejecuta la aplicación mientras investiga los problemas de rendimiento. Las acciones del depurador como establecer puntos de interrupción, ejecutar paso a paso e interrumpir todos, entre otras, pueden ayudarle a centrarse en las investigaciones de rendimiento en las rutas de acceso de código que son más importantes. Si realiza esas acciones mientras la aplicación se ejecuta, puede eliminar el ruido del código que no le interesa y reducir considerablemente la cantidad de tiempo necesario para diagnosticar un problema.

Importante

Las Herramientas de diagnóstico integradas en el depurador se admiten para el desarrollo de .NET en Visual Studio, incluido ASP.NET, ASP.NET Core, desarrollo nativo o de C++ y aplicaciones de modo mixto (.NET y nativas). Para ejecutar las herramientas de generación de perfiles con el depurador se requiere Windows 8 y versiones posteriores (ventana Herramientas de diagnóstico).

En este tutorial va a:

  • Tomar instantáneas de la memoria
  • Analizar el uso de memoria

Si Uso de memoria no le proporciona los datos que necesita, las demás herramientas de generación de perfiles del Generador de perfiles de rendimiento proporcionan distintos tipos de información que pueden resultarle útiles. En muchos casos, el cuello de botella de rendimiento de la aplicación puede no ser debido a la memoria sino a la CPU, la representación de interfaz de usuario o el tiempo de solicitud de red.

Nota

Compatibilidad con el asignador personalizado El generador de perfiles de memoria nativa funciona mediante la recopilación de datos de asignación de eventos de ETW que se emiten en tiempo de ejecución. Los asignadores de CRT y Windows SDK se han anotado en el nivel de origen para que se pueden capturar los datos de asignación. Si escribe sus propios asignadores, las funciones que devuelven un puntero a la memoria de montón recientemente asignada se pueden decorar con __declspec(allocator), tal como se muestra en este ejemplo para myMalloc:

__declspec(allocator) void* myMalloc(size_t size)

Recopilar datos de uso de memoria

  1. Abra el proyecto que desee depurar en Visual Studio y establezca un punto de interrupción en la aplicación en el punto donde desee empezar a examinar el uso de memoria.

    Si tiene un área donde sospecha que hay un problema de memoria, establezca el primer punto de interrupción antes de que se produzca dicho problema.

    Sugerencia

    Dado que puede resultar complicado capturar el perfil de memoria de una operación que le interese cuando la aplicación asigna y desasigna memoria con frecuencia, establezca puntos de interrupción al principio y al final de la operación (o revise paso a paso la operación) para buscar el punto exacto en que se modificó la memoria.

  2. Establezca un segundo punto de interrupción al final de la función o la región de código que quiera analizar (o después de que se produzca un problema de memoria sospechado).

  3. La ventana Herramientas de diagnóstico aparece automáticamente a no ser que la desactive. Para que la ventana se vuelva a mostrar, haga clic en Depurar>Windows>Mostrar Herramientas de diagnóstico.

  4. Elija Uso de memoria con la opción Seleccionar herramientas en la barra de herramientas.

    Screenshot of Diagnostics Tools.

    Screenshot of Diagnostics Tools.

  5. Haga clic en Depurar / Iniciar depuración (o Inicio en la barra de herramientas o F5).

    Cuando la aplicación finaliza la carga, se muestra la vista Resumen de las herramientas de diagnóstico.

    Screenshot of Diagnostics Tools Summary Tab.

    Nota:

    Dado que la recopilación de datos de memoria puede afectar al rendimiento de depuración de las aplicaciones nativas o de modo mixto, las instantáneas de memoria están deshabilitadas de forma predeterminada. Para habilitar las instantáneas en aplicaciones nativas o de modo mixto, inicie una sesión de depuración (tecla de método abreviado: F5). Cuando aparezca la ventana Herramientas de diagnóstico, seleccione la pestaña Uso de memoria y luego elija Generación de perfiles de montón.

    Screenshot of Enable snapshots.

    Detenga (tecla de método abreviado: Mayús+F5) y reinicie la depuración.

    Screenshot of Diagnostics Tools Summary Tab.

    Nota:

    Dado que la recopilación de datos de memoria puede afectar al rendimiento de depuración de las aplicaciones nativas o de modo mixto, las instantáneas de memoria están deshabilitadas de forma predeterminada. Para habilitar las instantáneas en aplicaciones nativas o de modo mixto, inicie una sesión de depuración (tecla de método abreviado: F5). Cuando aparezca la ventana Herramientas de diagnóstico, seleccione la pestaña Uso de memoria y luego elija Generación de perfiles de montón.

    Screenshot of Enable snapshots.

    Detenga (tecla de método abreviado: Mayús+F5) y reinicie la depuración.

  6. Para tomar una instantánea al comienzo de la sesión de depuración, elija Instantánea en la barra de herramientas reducida Uso de memoria. (Puede ser útil para establecer un punto de interrupción aquí también.)

    Screenshot of Take Snapshot button.

    Screenshot of Take Snapshot button.

    Sugerencia

    Para crear una línea base para las comparaciones de memoria, considere la posibilidad de tomar una instantánea al comienzo de la sesión de depuración.

  7. Ejecute el escenario que hará que se alcance el primer punto de interrupción.

  8. Mientras el depurador está en pausa en el primer punto de interrupción, elija Instantánea en la barra de herramientas reducida Uso de memoria.

  9. Presione F5 para ejecutar la aplicación hasta el segundo punto de interrupción.

  10. Ahora, haga otra instantánea.

    En este punto, puede empezar a analizar los datos.

    Si tiene problemas para recopilar o mostrar datos, consulte Solución de problemas en la generación de perfiles y corrección de problemas.

Analizar el uso de memoria

Las filas de la tabla de resumen Uso de memoria enumeran las instantáneas que se tomaron durante la sesión de depuración y proporcionan vínculos a vistas más detalladas.

Screenshot of Memory Usage table.

Screenshot of Memory Usage table.

El nombre de la columna depende del modo de depuración seleccionado en las propiedades del proyecto: .NET, nativo o mixto (.NET y nativo).

  • Las columnas Objetos (dif.) y Asignaciones (dif.) muestran el número de objetos en la memoria .NET y nativa cuando se tomó la instantánea.

  • La columna Tamaño de montón (dif.) muestra el número de bytes en los montones .NET y nativos.

Cuando se toman varias instantáneas, las celdas de la tabla de resumen incluyen el cambio de valor entre la instantánea de la fila y la instantánea anterior.

Para analizar el uso de memoria, haga clic en uno de los vínculos que abre un informe detallado del uso de memoria:

  • Para ver los detalles de la diferencia entre la instantánea actual y la anterior, elija el vínculo de cambio a la izquierda de la flecha (Memory Usage Increase). Una flecha roja indica un aumento en el uso de memoria, mientras que una flecha verde indica una disminución.

Sugerencia

Para ayudar a identificar problemas de memoria más rápidamente, los informes de diferencias se ordenan por tipos de objeto que más aumentaron en número total (haga clic en el vínculo de cambio en la columna Objetos (dif.) ) o que más aumentaron en el tamaño total del montón (haga clic en el vínculo de cambio en la columna Tamaño de montón (dif.) ).

  • Para ver los detalles únicamente de la instantánea seleccionada, haga clic en el vínculo de no cambio.

    El informe aparece en una ventana separada.

Informes de tipos administrados

Elija el vínculo actual de una celda Objetos (dif.) o Asignaciones (dif.) de la tabla de resumen Uso de memoria.

Screenshot of managed type report.

Screenshot of managed type report.

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 al nodo raíz en el 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 Objetos a los que se hace referencia muestra las referencias que se incluyen en el tipo seleccionado en el panel superior.

Screenshot of Referenced Objects report.

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

Screenshot of Referenced Objects report.

Para mostrar las instancias de un tipo seleccionado en el panel superior, haga clic en "Ver instancias" junto al tipo de objeto.

Screenshot of the Instances view in the Memory Usage tool.

Screenshot of the Instances view in the Memory Usage tool.

La vista Instancias muestra las instancias del objeto seleccionado en la instantánea en el panel superior. Los paneles Rutas de acceso al nodo raíz y Objetos a los que se hace referencia muestran los objetos que hacen referencia a la instancia seleccionada y los tipos a los que hace referencia la instancia seleccionada. Cuando el depurador se detiene en el punto donde se tomó la instantánea, puede desplazar el puntero sobre la celda Valor para mostrar los valores del objeto en la información sobre herramientas.

Informes de tipo nativo

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.

Screenshot of Native Type View.

Screenshot of Native Type View.

La Vista de tipos muestra el número y el tamaño de los tipos de la instantánea.

  • Elija el icono de instancias (The instance icon in the Object Type column) 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 .

    Screenshot of the Instances view and Allocation Call Stack pane.

  • Elija Ver instancias junto a 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 .

    Screenshot of the Instances view and Allocation Call Stack pane.

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

    Screenshot of Stacks view.

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

    Screenshot of Stacks view.

Información de uso de memoria

Para la memoria administrada, la herramienta Análisis de memoria también proporciona múltiples y potentes informaciones automáticas integradas. 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.

Screenshot of the insight view in the Memory Usage tool.

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 veces el tamaño de la cadena.

La sección Matriz dispersa muestra matrices que se rellenan principalmente con cero elementos, lo cual 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 Pérdidas del controlador de eventos, disponible en visual Studio 2022, versión 17.9 versión preliminar 1, muestra posibles pérdidas de memoria que pueden producirse 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, en las que la memoria no utilizada no se libera 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. La pestaña Información muestra nodos de memoria nativa falsos en el gráfico de objetos, que los objetos primarios conservan, de modo que la interfaz de usuario los reconocerá y mostrará su tamaño y gráfico de referencia.

Screenshot of the native insight view in the Memory Usage tool.

Informes de cambios (diferencias)

  • Elija el vínculo de cambio en una celda de la tabla de resumen de la pestaña Uso de memoria en la ventana Herramientas de diagnóstico .

    Screenshot of Choose a change link in a cell.

    Screenshot of Choose a change link in a cell.

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

    Screenshot of Choose a snapshot from the Compare To list.

    Screenshot of Choose a snapshot from the Compare with list.

El informe de cambios agrega columnas (marcadas con (Dif.) ) al informe base, que muestran la diferencia entre el valor de la instantánea de base y la instantánea de comparación. Este es el aspecto de un informe de diferencias de la vista de tipo nativo:

Screenshot of Native Types Diff View.

Screenshot of Native Types Diff View.

Blogs y vídeos

Analyze CPU and Memory While Debugging (Análisis de la CPU y la memoria durante la depuración)

Blog de Visual C++: Generación de perfiles de memoria en Visual C++ 2015

Pasos siguientes

En este tutorial, ha aprendido cómo recopilar y analizar los datos de uso de la memoria. Si ya ha completado el recorrido por el perfilador, puede que desee leer sobre un enfoque general para optimizar el código utilizando las herramientas de perfilado.

En este tutorial, ha aprendido cómo recopilar y analizar los datos de uso de la memoria durante la depuración. Es posible que quiera obtener más información sobre el análisis del uso de memoria en las versiones de lanzamiento mediante el generador de perfiles de rendimiento.