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 memoria può eseguire nelle build di rilascio o di debug. In questo articolo, viene illustrato come usare lo strumento Utilizzo memoria in il Visual Studio Profiler delle prestazioni, consigliato per le build di rilascio. 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 dell'utilizzo della memoria
Per avviare una sessione di diagnostica dell'utilizzo della memoria:
Aprire un progetto in Visual Studio.
Lo strumento Utilizzo memoria supporta app .NET, ASP.NET, C++o in modalità mista (.NET e native).
Nel menu Debug impostare la configurazione della soluzione su Versione e selezionare Debugger Windows locale (o Computer locale) come destinazione di distribuzione.
Nella barra dei menu, selezionare Debug>Profiler delle prestazioni.
In Strumenti disponibili, selezionare Utilizzo memoriae quindi selezionare Avvia.
Monitorare l'uso della memoria
Quando avvii una sessione di diagnostica, viene avviata l'app e la finestra strumenti di diagnostica visualizza un grafico della sequenza temporale dell'uso della memoria dell'app.
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. 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.
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 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, seleziona Acquisisci snapshot quando vuoi acquisire i dati della memoria.
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.
Se si verificano problemi durante la raccolta o la visualizzazione dei dati, consultare Risoluzione degli errori di profilatura e risoluzione dei problemi.
Report 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.
Istantanee dell'utilizzo della memoria
I numeri nei riquadri Snapshot mostrano gli oggetti e i byte in memoria al momento della creazione di ciascun snapshot e la differenza tra lo snapshot e il precedente.
I numeri sono collegamenti che aprono dettagliate utilizzo memoria visualizzazioni report in nuove finestre di Visual Studio. Un rapporto dettagliato sullo snapshot mostra i tipi e le istanze di uno snapshot. Un report delle differenze tra snapshot (diff) confronta i tipi e le istanze in due snapshot.
Per C++, la colonna Objects (Diff) è denominata Allocations (Diff).
Immagine | Descrizione |
---|---|
![]() |
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. |
![]() |
Differenza tra il numero totale di oggetti di memoria in questo snapshot e lo snapshot precedente. Selezionare questo collegamento per visualizzare un report diff dello snapshot ordinato in base alla differenza nel numero totale di istanze dei tipi. |
![]() |
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. |
![]() |
Differenza tra le dimensioni totali degli oggetti 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. Selezionare questo collegamento per visualizzare un report diff dello snapshot ordinato in base alla differenza nella dimensione totale delle istanze dei tipi. |
Immagine | Descrizione |
---|---|
![]() |
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. |
![]() |
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. |
![]() |
Differenza tra le dimensioni totali degli oggetti 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 uno snapshot è il primo in una sessione di diagnostica. Nessuna differenza indica che la differenza è zero. Seleziona questo collegamento per visualizzare un report di differenze dello snapshot ordinato per differenza nella dimensione totale delle istanze dei tipi. |
![]() |
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 dell'istantanea. Viene ordinato in base alla differenza nel numero totale di istanze dei tipi. |
Report sui tipi gestiti
Seleziona il collegamento corrente di una cella Objects (Diff) nella tabella di riepilogo dell'Utilizzo della Memoria.
Nota
Per il codice .NET, l'icona View Instances () è disponibile solo quando si usa lo strumento Utilizzo memoria integrata nel debugger o quando si apre uno snapshot dell'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 alla 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.
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 alla 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.
L'albero dei Tipi di Riferimento visualizza i riferimenti detenuti dal tipo selezionato nel riquadro superiore.
Nell'albero Tipi a cui si fa riferimento vengono visualizzati i riferimenti contenuti nel tipo selezionato nel riquadro superiore.
Filtri dell'albero dei report
Molti tipi nelle app non sono necessari agli sviluppatori per analizzare i problemi di memoria. I filtri del report snapshot possono nascondere la maggior parte di questi tipi negli alberi memoria gestita e percorsi di radice.
Per filtrare un albero in base al nome del tipo, inserire 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 Mostra 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 oggetti piccoli nel menu a discesa Filtro per nascondere i tipi le cui dimensioni (byte) sono inferiori allo 0,5 percento della memoria totale.
Report dei tipi nativi
Scegliere il collegamento corrente di un allocazioni (Diff) o cella Diff (Heap Size) nella tabella di riepilogo Utilizzo memoria della finestra Strumenti di diagnostica.
La Vista Tipi mostra 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 visualizzazione di istanze mostra ogni istanza del tipo selezionato. Se si seleziona un'istanza, viene visualizzato lo stack di chiamate che ha generato la creazione dell'istanza nel riquadro stack di chiamate di allocazione. Queste informazioni sono disponibili solo durante il debug.
Scegliere l'icona delle istanze (
) di un tipo selezionato per visualizzare informazioni sugli oggetti del tipo selezionato nello snapshot.
La vista Istanze mostra ogni istanza del tipo selezionato. Se si seleziona un'istanza, nel riquadro Stack di Chiamate di Allocazione viene visualizzato lo stack di chiamate che ha portato alla creazione dell'istanza.
Scegliere Visualizzazione stack nella lista modalità di visualizzazione per visualizzare lo stack di allocazione per il tipo selezionato.
Informazioni dettagliate sull'utilizzo della memoria
Per la memoria gestita, lo strumento di analisi della memoria offre anche potenti insight automatici integrati. Selezionare la scheda Insights nei rapporti sui Tipi gestiti, dove vengono visualizzati i pertinenti approfondimenti automatici, come stringhe duplicate, matrici sparsee perdite di gestori di eventi.
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) volte 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 l'editore dell'evento sopravvive al sottoscrittore, il sottoscrittore rimane vivo, anche se non ci sono altri riferimenti ad esso. 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 la dimensione della memoria nativa che trattengono. La scheda informazioni dettagliate mostra i nodi di memoria nativa falsi nel nodo oggetto, che vengono mantenuti dai relativi oggetti padre in modo che l'interfaccia utente li riconosca e visualizzi le relative dimensioni e il grafico delle referenze.
Report delle modifiche (diff)
Scegliere il link di modifica in una cella del riquadro Snapshot nella pagina della panoramica dell'utilizzo della memoria.
Scegliere uno snapshot nell'elenco confronto tra di un report gestito o nativo.
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 rapporto di differenze di visualizzazione Tipo Nativo:
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).