Condividi tramite


Analizzare l'utilizzo della memoria nelle build di versione (C#, Visual Basic, C++, F#)

Lo strumento Utilizzo memoria monitora l'uso della memoria dell'app. È possibile usare lo strumento per studiare gli effetti della memoria in tempo reale degli scenari che si stanno sviluppando attivamente in Visual Studio. È possibile acquisire snapshot dettagliati degli stati di memoria dell'app e confrontare gli snapshot per trovare le cause radice 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 della memoria può eseguire nelle versioni di rilascio o di debug. In questo articolo, mostriamo come utilizzare lo strumento di utilizzo della memoria nel Visual Studio Profiler delle prestazioni, 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.

Per un'esperienza ottimale con questa documentazione, scegliere il linguaggio di sviluppo o il runtime preferito dall'elenco nella parte superiore dell'articolo.

Sessioni di diagnostica sull'uso della memoria

Per avviare una sessione diagnostica sull'utilizzo della memoria:

  1. Aprire un progetto in Visual Studio.

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

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

  3. Nella barra dei menu selezionare Debug>Profilo delle prestazioni.

  4. In Strumenti disponibili, selezionare Utilizzo memoriae quindi selezionare Avvia.

    Avvia una sessione di diagnostica di utilizzo della memoria.

Monitorare l'uso della memoria

Quando avvii una sessione di diagnostica, la tua app si avvia, e la finestra Strumenti di Diagnostica visualizza un grafico della sequenza temporale dell'uso della memoria dell'app.

Screenshot della finestra Strumenti di diagnostica nel profiler delle prestazioni di Visual Studio che mostra un grafico della sequenza temporale dell'uso della memoria dell'app. Panoramica del rapporto sulla memoria

Il grafico della sequenza temporale mostra le fluttuazioni della memoria durante l'esecuzione dell'app. I picchi nel grafico indicano in genere che alcuni codici raccolgono o creano dati e quindi lo eliminano al termine dell'elaborazione. Grandi picchi indicano le aree che possono essere ottimizzate. 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.

Acquisire snapshot degli stati di memoria dell'app

Un'app usa un numero elevato di oggetti e può essere utile concentrare l'analisi su uno scenario. In alternativa, è possibile trovare problemi di memoria da analizzare. È possibile acquisire snapshot durante una sessione di diagnostica per acquisire l'utilizzo della memoria in determinati momenti. È consigliabile ottenere uno screenshot iniziale di un'applicazione prima che si presenti un problema di memoria. Puoi scattare un'altra foto dopo la prima occorrenza del problema e ulteriori scatti se riesci a ripetere lo scenario.

Per raccogliere gli snapshot, selezionare Acquisisci snapshot quando si desidera acquisire i dati di memoria.

Screenshot dello scatto di un'istantanea.

Chiudere la sessione di diagnostica

Per arrestare una sessione di monitoraggio senza creare un report, chiudere la finestra di diagnostica. Per generare un report al termine della raccolta o dell'acquisizione di snapshot, selezionare Interrompi raccolta.

Screenshot dell'arresto della raccolta.

Screenshot dell'arresto della raccolta.

Se si verificano problemi durante la raccolta o la visualizzazione dei dati, vedere Risolvere gli errori di profilatura e risolvere i problemi.

Rapporti sull'utilizzo della memoria

Dopo aver interrotto la raccolta dei dati, lo strumento utilizzo memoria arresta l'app e visualizza la pagina di panoramica utilizzo memoria.

Screenshot della pagina di panoramica nello strumento *Utilizzo memoria* nel *Visual Studio Performance Profiler*, che mostra un grafico di utilizzo della memoria e due riquadri di istantanee.

Screenshot della pagina di panoramica nello strumento *Utilizzo memoria* nel *Visual Studio Performance Profiler*, che mostra un grafico di utilizzo della memoria e due riquadri di istantanee.

Snapshot di utilizzo della memoria

I numeri nei riquadri Snapshot mostrano gli oggetti e i byte in memoria quando è stata creata ogni istantanea e la differenza tra l'istantanea e quella precedente.

I numeri sono collegamenti che aprono dettagliate utilizzo memoria visualizzazioni report in nuove finestre di Visual Studio. Un report dei dettagli dello snapshot mostra i tipi e le istanze in uno snapshot. Un rapporto di differenze tra snapshot (diff) confronta i tipi e le istanze in due snapshot.

Screenshot dei collegamenti di visualizzazione Snapshot

Per C++, la colonna Objects (Diff) è denominata Allocations (Diff).

Immagine Descrizione
passaggio 1 Numero totale di oggetti in memoria durante l'acquisizione dello snapshot. Selezionare questo collegamento per visualizzare un report dei dettagli dello snapshot ordinato in base al numero di istanze dei tipi.
passaggio 2 Differenza tra il numero totale di oggetti di memoria in questo snapshot e lo snapshot precedente. Selezionare questo collegamento per visualizzare un report delle differenze tra snapshot ordinato per differenza nel conteggio totale delle istanze dei tipi.
passaggio 3 Numero totale di byte in memoria durante l'acquisizione dello snapshot. Selezionare questo collegamento per visualizzare un report dei dettagli dello snapshot ordinato in base alle dimensioni totali delle istanze del tipo.
passaggio 4 Differenza tra le dimensioni totali degli oggetti di memoria in questo snapshot e lo snapshot precedente. Un numero positivo indica che la dimensione della memoria di questo snapshot è maggiore di quella precedente e un numero negativo indica che la dimensione è inferiore. Baseline significa che un'istantanea è la prima in una sessione di diagnostica. Nessuna differenza indica che la differenza è zero. Seleziona questo link per visualizzare un report delle differenze dello snapshot ordinato per la variazione nella dimensione totale delle istanze dei tipi.

collegamenti alla visualizzazione snapshot

Immagine Descrizione
passaggio 1 Numero totale di byte in memoria durante l'acquisizione dello snapshot. Selezionare questo collegamento per visualizzare un report dei dettagli dello snapshot ordinato in base alle dimensioni totali delle istanze del tipo.
passaggio 2 Numero totale di oggetti in memoria durante l'acquisizione dello snapshot. Selezionare questo collegamento per visualizzare un report dei dettagli dello snapshot ordinato in base al numero di istanze dei tipi.
passaggio 3 Differenza tra le dimensioni totali degli oggetti di memoria in questo snapshot e lo snapshot precedente. Un numero positivo indica che la dimensione della memoria di questo snapshot è maggiore di quella precedente e un numero negativo indica che la dimensione è inferiore. Baseline significa che un'istantanea è la prima in una sessione di diagnostica. Nessuna differenza indica che la differenza è zero. Seleziona questo link per visualizzare un report delle differenze dello snapshot ordinato per la variazione nella dimensione totale delle istanze dei tipi.
passaggio 4 Differenza tra il numero totale di oggetti di memoria in questo snapshot e lo snapshot precedente. Selezionare questo collegamento per visualizzare il rapporto sulle differenze dello snapshot. È ordinato in base alla differenza nel conteggio totale delle istanze dei tipi.

Report sui tipi gestiti

Scegliere il collegamento attuale di una cella Objects (Diff) nella tabella riepilogativa dell'Utilizzo della memoria.

Schermata del report del tipo gestito.

Nota

Per il codice .NET, l'icona View Instances (l'icona dell'istanza nella colonna Tipo di oggettoDBG_MMA_InstancesIcon) è disponibile solo mentre si utilizza lo strumento integrato del debugger per l'utilizzo della memoria o quando si apre uno snapshot heap e si sceglie Debug della memoria gestita .

Il riquadro superiore mostra il numero e le dimensioni dei tipi nello snapshot, incluse le dimensioni di tutti gli oggetti a cui fa riferimento il tipo (dimensione inclusiva).

Nell'albero Percorsi verso la radice nel riquadro inferiore vengono visualizzati gli oggetti che fanno riferimento al tipo selezionato nel riquadro superiore. .NET Garbage Collector pulisce la memoria per un oggetto solo quando l'ultimo tipo a cui fa riferimento è stato rilasciato. Per altre informazioni sull'uso dell'albero percorsi di radice, vedere Analizzare il percorso critico alla radice.

Screenshot del report del tipo gestito.

Il riquadro superiore mostra il numero e le dimensioni dei tipi nello snapshot, incluse le dimensioni di tutti gli oggetti a cui fa riferimento il tipo (dimensione inclusiva).

Nell'albero Percorsi verso la radice nel riquadro inferiore vengono visualizzati gli oggetti che fanno riferimento al tipo selezionato nel riquadro superiore. .NET Garbage Collector pulisce la memoria per un oggetto solo quando l'ultimo tipo a cui fa riferimento è stato rilasciato.

Nell'albero Tipi a cui si fa riferimento vengono visualizzati i riferimenti contenuti nel tipo selezionato nel riquadro superiore.

Screenshot del report Oggetti di riferimento.

Nell'albero Tipi a cui si fa riferimento vengono visualizzati i riferimenti contenuti nel tipo selezionato nel riquadro superiore.

Screenshot del report Oggetti di riferimento.

Filtri dell'albero dei report

Molti tipi di dati nelle app non sono necessari agli sviluppatori di app per analizzare i problemi di memoria. I filtri del report snapshot possono nascondere la maggior parte di questi tipi negli alberi di memoria gestita e ai percorsi di radice .

Opzioni di ordinamento e filtro

Opzioni di ordinamento e filtro

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

  • 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 o ai componenti del framework o vengono generati dal compilatore.

  • Selezionare Comprimi gli oggetti piccoli nell'elenco a discesa Filtro per nascondere i tipi le cui dimensioni (byte) sono inferiori allo 0,5% della memoria totale.

Report sui tipi nativi

Scegliere il collegamento corrente di una cella Allocazioni (Diff) o Dimensione heap (Diff) nella tabella di riepilogo Utilizzo memoria della finestra Strumenti di diagnostica.

La Vista Tipi visualizza il numero e le dimensioni dei tipi nello snapshot.

  • Scegliere l'icona Visualizza istanze accanto a un tipo selezionato per visualizzare informazioni sugli oggetti del tipo selezionato nello snapshot.

    La vista istanze visualizza ogni istanza del tipo selezionato. Selezionando un'istanza, viene mostrato lo stack di chiamate che ha generato la creazione dell'istanza nel pannello Stack di chiamate di allocazione. Queste informazioni sono disponibili solo durante il debug.

    screenshot della visualizzazione Istanze e dello stack di chiamate di allocazione.

  • Scegliere l'icona delle istanze (L'icona dell'istanza nella colonna Tipo di oggetto) di un tipo selezionato per visualizzare informazioni sugli oggetti del tipo selezionato nello snapshot.

    La vista istanze visualizza ogni istanza del tipo selezionato. Selezionando un'istanza, viene mostrato lo stack di chiamate che ha generato la creazione dell'istanza nel pannello Stack di chiamate di allocazione.

    screenshot della vista delle istanze e del pannello stack delle chiamate di allocazione.

  • Scegliere Stacks per visualizzare lo stack di allocazione per il tipo selezionato.

    Screenshot della visualizzazione Stacks.

  • Scegliere Visualizzazione Stacks nella modalità di visualizzazione nella lista per visualizzare lo stack di allocazione per il tipo selezionato.

    Screenshot della visualizzazione Stack.

Informazioni dettagliate sull'utilizzo della memoria

Per la memoria gestita, lo strumento di analisi della memoria offre anche molteplici approfondimenti automatici incorporati potenti. Selezionare la scheda Insights nei report Tipi gestiti e vengono visualizzati gli approfondimenti automatici applicabili, ad esempio Stringhe duplicate, matrici sparsee perdite dei gestori di eventi .

Screenshot della visualizzazione delle informazioni dettagliate nello strumento Utilizzo memoria.

La sezione stringhe duplicate mostra l'elenco di stringhe che vengono allocate più volte nell'heap. Inoltre, questa sezione mostra la memoria totale sprecata, ovvero il (numero di istanze - 1) per la dimensione della stringa.

La sezione matrici sparse mostra le matrici che sono principalmente riempite con zero elementi, che possono risultare inefficienti in termini di prestazioni e utilizzo della memoria. Lo strumento di analisi della memoria rileverà automaticamente queste matrici e mostrerà la quantità di memoria sprecato a causa di questi valori zero.

La sezione Event Handler Leaks, disponibile in Visual Studio 2022 versione 17.9 Preview 1, mostra potenziali perdite di memoria che possono verificarsi quando un oggetto sottoscrive l'evento di un altro oggetto. Se il pubblicatore dell'evento supera in longevità il sottoscrittore, il sottoscrittore rimane attivo, anche se non ci sono altri riferimenti. Ciò può causare perdite di memoria, in cui la memoria inutilizzata non viene liberata correttamente, causando l'uso di maggiore e maggiore memoria nell'applicazione nel tempo.

Alcuni tipi sono noti per avere campi che possono essere letti per determinare le dimensioni della memoria nativa che gestiscono. La scheda informazioni mostra nodi di memoria nativa falsi nel grafo degli oggetti, che vengono mantenuti dai relativi oggetti padre in modo che l'interfaccia utente li riconosca e visualizzi le relative dimensioni e grafo di riferimento.

Screenshot della visualizzazione delle informazioni dettagliate native nello strumento Utilizzo memoria.

Report di cambiamenti (Diff)

  • Scegliere il collegamento di modifica in una cella del riquadro snapshot nella pagina di panoramica dell'utilizzo della memoria.

    Screenshot di Scegliere un collegamento di modifica in una cella.

    Screenshot di Scegliere un collegamento di modifica in una cella.

  • Scegliere uno snapshot nell'elenco confronto tra di un report gestito o nativo.

    Screenshot di Scegliere uno snapshot dall'elenco Confronta con.

    Screenshot di Scegliere uno snapshot dall'elenco Confronta a.

Il report delle modifiche aggiunge colonne (contrassegnate con (Diff)) al report di base che mostra la differenza tra il valore dello snapshot di base e lo snapshot di confronto. Ecco come potrebbe apparire un report di confronto per una visualizzazione del tipo nativo:

screenshot della visualizzazione Diff dei tipi nativi.

Il riquadro superiore mostra il numero e le dimensioni dei tipi nello snapshot, incluse le dimensioni di tutti gli oggetti a cui fa riferimento il tipo (dimensione inclusiva).