Analizzare l'utilizzo della memoria senza eseguire il debug in Performance Profiler (C#, Visual Basic, C++, F#)

Lo strumento Utilizzo memoria monitora l'utilizzo della memoria dell'app. È possibile utilizzare lo strumento per studiare gli effetti in tempo reale sulla memoria degli scenari in corso di sviluppo attivo in Visual Studio. Creare snapshot dettagliati degli stati di memoria dell'app e confrontare gli snapshot per individuare le cause principali dei problemi di memoria. Lo strumento Utilizzo memoria è supportato nelle app .NET, ASP.NET, C++o in modalità mista (.NET e native).

Lo strumento Utilizzo memoria può essere eseguito con o senza debugger. In questo articolo viene illustrato come usare lo strumento Utilizzo memoria senza il debugger in Visual Studio Performance Profiler, consigliato per le build di versione. Per informazioni sulla scelta dello strumento di analisi della memoria migliore per le proprie esigenze, vedere Scegliere uno strumento di analisi della memoria.

Sessioni di diagnostica con lo strumento Utilizzo memoria

Per avviare una sessione di diagnostica con lo strumento Utilizzo memoria:

  1. Aprire un progetto in Visual Studio.

    Lo strumento Utilizzo memoria supporta app .NET, ASP.NET, C++o in modalità mista (.NET e native).

  2. Nel menu Debug impostare la configurazione della soluzione su Rilascio e selezionare Debugger Windows locale (o Computer locale) come destinazione di distribuzione.

  3. Nella barra dei menu selezionare Debug>Performance Profiler.

  4. In Strumenti disponibili selezionare Utilizzo memoria e quindi selezionare Avvia.

    Start a Memory Usage diagnostic session

Monitorare l'uso della memoria

Quando si avvia una sessione di diagnostica, l'app viene avviata e nella finestra Strumenti di diagnostica viene visualizzato un grafico della sequenza temporale dell'uso della memoria dell'app.

Screenshot of the Diagnostic Tools window in the Visual Studio Performance Profiler showing a timeline graph of the app's memory use.

Screenshot of the Diagnostic Tools window in the Visual Studio Performance Profiler showing a timeline graph of the app's memory use.

Il grafico della sequenza temporale mostra le fluttuazioni di memoria durante l'esecuzione dell'app. Eventuali picchi nel grafico in genere indicano che alcune stringhe di codice stanno raccogliendo o creando dati, per poi rimuoverli al termine del processo. Picchi di grandi dimensioni indicano le aree che è possibile ottimizzare. La preoccupazione principale è un aumento del consumo di memoria che non viene restituito. Ciò può indicare un uso inefficiente della memoria o persino una perdita di memoria.

Creare snapshot degli stati di memoria dell'app

Poiché un'app usa un gran numero di oggetti, si potrebbe voler concentrare la propria analisi su un solo scenario. Oppure, si potrebbe desiderare esaminare i problemi di memoria. Durante una sessione di diagnostica è possibile creare alcuni snapshot per rilevare l'utilizzo della memoria in determinati momenti. È consigliabile ottenere uno snapshot di base di un'app prima che venga visualizzato un problema di memoria. È possibile creare un altro snapshot dopo la prima occorrenza del problema e altri snapshot se è possibile ripetere lo scenario.

Per raccogliere gli snapshot, scegliere Crea snapshot quando si vogliono acquisire i dati di memoria.

Chiudere la sessione di diagnostica

Per arrestare una sessione di monitoraggio senza creare un report, chiudi semplicemente la finestra di diagnostica. Per generare un report al termine della raccolta o della creazione di snapshot, selezionare Arresta raccolta.

Stop Collection

In caso di problemi durante la raccolta o la visualizzazione dei dati, vedere Risolvere gli errori di profilatura e risolvere i problemi.

Report sull'utilizzo della memoria

Una volta completata la raccolta dei dati, lo strumento Utilizzo memoria arresta l'app e visualizza la pagina di panoramica Utilizzo memoria.

Screenshot of the overview page in the Memory Usage tool in the Visual Studio Performance Profiler, showing a memory usage graph and two snapshot panes.

Screenshot of the overview page in the Memory Usage tool in the Visual Studio Performance Profiler, showing a memory usage graph and two snapshot panes.

Snapshot di utilizzo della memoria

I numeri nei riquadri Snapshot mostrano gli oggetti e i byte in memoria quando è stato creato ogni snapshot e la differenza tra lo snapshot e quello precedente.

I numeri sono collegamenti che aprono visualizzazioni report dettagliate di Utilizzo memoria in nuove finestre di Visual Studio. Un report dettagli dello snapshot mostra i tipi e le istanze in uno snapshot. Un report differenze degli snapshot confronta i tipi e le istanze in due snapshot.

Snapshot view links

Image Descrizione
Step 1 Il numero totale di byte in memoria quando è stato creato lo snapshot. Selezionare questo collegamento per visualizzare un report dettagli dello snapshot, ordinato in base alla dimensione totale delle istanze di tipo.
Step 2 Il numero totale di oggetti in memoria quando è stato creato lo snapshot. Selezionare questo collegamento per visualizzare un report dettagli dello snapshot, ordinato in base al numero di istanze dei tipi.
Step 3 La differenza tra la dimensione totale degli oggetti di memoria in questo snapshot e nello snapshot precedente. Un numero positivo indica che la dimensione della memoria dello snapshot è maggiore rispetto allo snapshot precedente e un numero negativo indica che la dimensione è minore. Linea di base significa che uno snapshot è il primo di una sessione di diagnostica. Nessuna differenza significa che la differenza è zero. Selezionare questo collegamento per visualizzare un report differenze degli snapshot, ordinato in base alla differenza riguardo alla dimensione totale delle istanze dei tipi.
Step 4 La differenza tra il numero totale degli oggetti di memoria in questo snapshot e nello snapshot precedente. Selezionare questo collegamento per visualizzare un report diff dello snapshot. Viene ordinato in base alla differenza nel numero totale di istanze dei tipi.

Snapshot view links

Image Descrizione
Step 1 Il numero totale di oggetti in memoria quando è stato creato lo snapshot. Selezionare questo collegamento per visualizzare un report dettagli dello snapshot, ordinato in base al numero di istanze dei tipi.
Step 2 La differenza tra il numero totale degli oggetti di memoria in questo snapshot e nello snapshot precedente. Selezionare questo collegamento per visualizzare un report differenze degli snapshot, ordinato in base alla differenza riguardo al numero totale delle istanze dei tipi.
Step 3 Il numero totale di byte in memoria quando è stato creato lo snapshot. Selezionare questo collegamento per visualizzare un report dettagli dello snapshot, ordinato in base alla dimensione totale delle istanze di tipo.
Step 4 La differenza tra la dimensione totale degli oggetti di memoria in questo snapshot e nello snapshot precedente. Un numero positivo indica che la dimensione della memoria dello snapshot è maggiore rispetto allo snapshot precedente e un numero negativo indica che la dimensione è minore. Linea di base significa che uno snapshot è il primo di una sessione di diagnostica. Nessuna differenza significa che la differenza è zero. Selezionare questo collegamento per visualizzare un report differenze degli snapshot, ordinato in base alla differenza riguardo alla dimensione totale delle istanze dei tipi.

Report snapshot di Utilizzo memoria

Quando si seleziona uno dei collegamenti dello snapshot nella pagina di panoramica Utilizzo di memoria, un report snapshot viene aperto in una nuova pagina.

Memory Usage snapshot report

Memory Usage snapshot report

Se un Tipo di oggetto è blu, è possibile selezionarlo per passare all'oggetto nel codice sorgente, in una finestra separata.

I tipi che non è possibile identificare o il cui coinvolgimento nel codice non compreso sono probabilmente oggetti .NET, sistema operativo o compilatore. Lo strumento Utilizzo memoria visualizza questi oggetti se sono coinvolti nelle catene di proprietà degli oggetti.

Nei report snapshot:

  • L'albero memoria gestita mostra i tipi e le istanze nel report. Quando si seleziona un tipo o un'istanza, vengono visualizzati gli alberi Percorsi della radice e Oggetti a cui si fa riferimento per l'elemento selezionato.

  • L'albero Percorsi della radice mostra la catena di oggetti che fanno riferimento a un tipo o a un'istanza. .NET Garbage Collector pulisce la memoria per un oggetto solo quando sono stati rilasciati tutti i riferimenti.

  • L'albero Tipi a cui si fa riferimento o Oggetti a cui si fa riferimento mostra gli oggetti a cui fa riferimento l'istanza o il tipo selezionato.

Filtri dell'albero dei report

Molti tipi di app non sono necessari per gli sviluppatori di app. I filtri del report snapshot possono nascondere la maggior parte di questi tipi negli alberi Di memoria gestita e Percorsi a radice .

Sort and filter options

Sort and filter options

  • Per filtrare un albero in base al nome del tipo, immettere il nome nella casella Filtro. Il filtro non fa distinzione tra maiuscole e minuscole e riconosce la stringa specificata in ogni parte del nome del tipo.

  • Selezionare Comprimi oggetti piccoli nell'elenco a discesa Filtro per nascondere i tipi la cui Dimensione (byte) è minore dello 0,5% della memoria totale.

  • Selezionare Just My Code nell'elenco a discesa Filtro per nascondere la maggior parte delle istanze generate da codice esterno. I tipi esterni appartengono al sistema operativo, ai componenti del framework oppure sono generati dal compilatore.

Report dettagli degli snapshot

Un report dettagli dello snapshot descrive uno snapshot di una sessione di diagnostica. Per aprire il report, selezionare il collegamento alla dimensione o agli oggetti in un riquadro dello snapshot.

Links to snapshot report in a snapshot pane

Links to snapshot report in a snapshot pane

Entrambi i collegamenti aprono lo stesso report. L'unica differenza è l'ordinamento iniziale dell'albero della memoria gestita. Il collegamento dimensione ordina il rapporto in base alla colonna Dimensione inclusiva (byte). Il collegamento Oggetti ordina il rapporto in base alla colonna Conteggio. È possibile modificare il tipo o la colonna di ordinamento dopo l'apertura del report.

Albero della memoria gestita (report dettagli snapshot)

L'albero memoria gestita elenca i tipi di oggetti contenuti in memoria. Espandere un nome di tipo per visualizzare le 10 istanze più grandi del tipo, ordinate in base alle dimensioni. Selezionare un tipo o un'istanza per visualizzare gli alberi Percorsi della radice e Oggetti a cui si fa riferimento per l'elemento selezionato.

Managed Heap tree

Managed Memory tree

L'albero della memoria gestita in un report dei dettagli dello snapshot include le colonne seguenti:

Nome Descrizione
Tipo oggetto Nome dell'istanza di tipo o di oggetto.
Conteggio Numero di istanze di oggetto del tipo. Il valore di Conteggio è sempre 1 per un'istanza.
Dimensioni (byte) Per un tipo, le dimensioni di tutte le istanze del tipo nello snapshot, meno le dimensioni degli oggetti contenuti nelle istanze. Per un'istanza, le dimensioni dell'oggetto, meno le dimensioni degli oggetti contenuti nell'istanza di .
Dimensione inclusiva (byte) La dimensione delle istanze del tipo o di una singola istanza, inclusa la dimensione degli oggetti contenuti.
Modulo Il modulo che contiene il costruttore.

Percorsi dell'albero radice (report dei dettagli dello snapshot)

L'albero Percorsi della radice mostra la catena di oggetti che fanno riferimento a un tipo o a un'istanza. .NET Garbage Collector pulisce la memoria per un oggetto solo quando sono stati rilasciati tutti i riferimenti.

Per un tipo nell'albero Percorsi della radice, il numero di oggetti che contengono riferimenti al tipo viene visualizzato nella colonna Conteggio riferimenti.

Paths to Root tree for types

Paths to Root tree for types

Tipi a cui si fa riferimento o albero di oggetti a cui si fa riferimento (report dei dettagli dello snapshot)

L'albero Tipi a cui si fa riferimento o Oggetti a cui si fa riferimento mostra gli oggetti a cui fa riferimento l'istanza o il tipo selezionato.

Referenced Objects tree for instances

Referenced Objects tree for instances

Un albero Tipi a cui si fa riferimento di un report dettagli dello snapshot include le colonne seguenti. Un albero degli oggetti a cui si fa riferimento non ha la colonna Conteggio riferimenti.

Nome Descrizione
Tipo di oggetto o Istanza Il nome del tipo o dell'istanza.
Conteggio riferimenti Per i tipi, il numero di istanze di oggetto del tipo.
Dimensioni (byte) Per un tipo, la dimensione di tutte le istanze del tipo, meno la dimensione degli oggetti contenuti nel tipo. Per un'istanza, la dimensione dell'oggetto meno la dimensione degli oggetti contenuti nell'oggetto.
Dimensione inclusiva (byte) La dimensione totale delle istanze del tipo o la dimensione dell'istanza, inclusa la dimensione degli oggetti contenuti.
Modulo Il modulo che contiene il costruttore.

Report delle differenze degli snapshot

Un report differenze degli snapshot mostra le differenze tra uno snapshot principale e lo snapshot precedente. Per aprire un report delle differenze, selezionare uno dei collegamenti differenza in un riquadro snapshot.

Entrambi i collegamenti aprono lo stesso report. L'unica differenza è l'ordinamento iniziale dell'albero della memoria gestita nel report. Il collegamento dimensione ordina il report in base alla colonna Differenza dimensioni inclusive (byte). Il collegamento oggetti ordina il rapporto in base alla colonna Diff. conteggio. È possibile modificare il tipo o la colonna di ordinamento dopo l'apertura del report.

Links to difference report in a snapshot pane

Links to difference report in a snapshot pane

Albero della memoria gestita (report diff dello snapshot)

L'albero memoria gestita elenca i tipi di oggetti contenuti in memoria. È possibile espandere un nome di tipo per visualizzare le 10 istanze più grandi del tipo, ordinate in base alle dimensioni. Selezionare un tipo o un'istanza per visualizzare gli alberi Percorsi della radice e Oggetti a cui si fa riferimento per l'elemento selezionato.

Managed Heap tree for a type in difference report

Managed Memory tree for a type in difference report

L'albero della memoria gestita in un report diff dello snapshot include le colonne seguenti:

Nome Descrizione
Tipo oggetto Nome dell'istanza di tipo o di oggetto.
Conteggio Numero di istanze di un tipo nello snapshot principale. Il valore di Conteggio è sempre 1 per un'istanza.
Diff. conteggio Per un tipo, differenza nel numero di istanze del tipo tra lo snapshot principale e quello precedente. Il campo è vuoto per un'istanza.
Dimensioni (byte) La dimensione degli oggetti nello snapshot principale, meno la dimensione degli oggetti negli oggetti. Per un tipo, Dimensione (byte) e Dimensione inclusiva (byte) corrispondono ai totali delle dimensioni delle istanze di tipo.
Diff. dimensione totale (byte) Per un tipo, la differenza nella dimensione totale delle istanze del tipo tra lo snapshot principale e quello precedente, meno la dimensione degli oggetti nelle istanze. Il campo è vuoto per un'istanza.
Dimensione inclusiva (byte) La dimensione degli oggetti nello snapshot principale, inclusa la dimensione degli oggetti negli oggetti.
Differenza dimensioni inclusive (byte) Per un tipo, la differenza nella dimensione di tutte le istanze del tipo tra lo snapshot principale e quello precedente, inclusa la dimensione degli oggetti negli oggetti. Il campo è vuoto per un'istanza.
Modulo Il modulo che contiene il costruttore.

Percorsi dell'albero radice (report diff dello snapshot)

L'albero Percorsi della radice mostra la catena di oggetti che fanno riferimento a un tipo o a un'istanza. .NET Garbage Collector pulisce la memoria per un oggetto solo quando sono stati rilasciati tutti i riferimenti.

Per un tipo nell'albero Percorsi della radice, il numero di oggetti che contengono riferimenti al tipo viene visualizzato nella colonna Conteggio riferimenti. La differenza di numero rispetto allo snapshot precedente è indicata nella colonna Diff. conteggio riferimenti.

Paths To Root tree in a diff report

Paths To Root tree in a diff report

Tipi a cui si fa riferimento o albero di oggetti a cui si fa riferimento (report diff dello snapshot)

L'albero Tipi a cui si fa riferimento o Oggetti a cui si fa riferimento mostra gli oggetti a cui fa riferimento l'istanza o il tipo selezionato.

Referenced Types in a diff report

Referenced Types in a diff report

Un albero Tipi a cui si fa riferimento di un report differenze dello snapshot include le colonne seguenti. Un albero Oggetti a cui si fa riferimento comprende le colonne Istanza, Dimensione (byte), Dimensione inclusiva (byte) e Modulo.

Nome Descrizione
Tipo di oggetto o Istanza Nome dell'istanza di tipo o di oggetto.
Conteggio riferimenti Numero di istanze di un tipo nello snapshot principale.
Diff. conteggio riferimenti Per un tipo, differenza nel numero di istanze del tipo tra lo snapshot principale e quello precedente.
Dimensioni (byte) La dimensione degli oggetti nello snapshot principale, meno la dimensione degli oggetti negli oggetti. Per un tipo, Dimensione (byte) e Dimensione inclusiva (byte) corrispondono ai totali delle dimensioni delle istanze di tipo.
Diff. dimensione totale (byte) Per un tipo, la differenza nella dimensione totale delle istanze del tipo tra lo snapshot principale e quello precedente, meno la dimensione degli oggetti nelle istanze.
Dimensione inclusiva (byte) La dimensione degli oggetti nello snapshot principale, inclusa la dimensione degli oggetti negli oggetti.
Differenza dimensioni inclusive (byte) Per un tipo, la differenza nella dimensione di tutte le istanze del tipo tra lo snapshot principale e quello precedente, inclusa la dimensione degli oggetti negli oggetti.
Modulo Il modulo che contiene il costruttore.

Report Approfondimento

In Visual Studio 2022, lo strumento analisi della memoria offre anche più potenti informazioni dettagliate predefinite per la memoria gestita. Selezionare la scheda Informazioni dettagliate nei report Tipi gestiti e mostra le informazioni dettagliate auto applicabili, ad esempio Stringhe duplicate, Matrici sparse e Perdite di gestori eventi. Per altre informazioni, vedere Informazioni dettagliate sull'utilizzo della memoria.

Screenshot of Managed memory insights.