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:
Aprire un progetto in Visual Studio.
Lo strumento Utilizzo memoria supporta app .NET, ASP.NET, C++, o in modalità mista (.NET e nativo).
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>Profilo delle prestazioni.
In Strumenti disponibili, selezionare Utilizzo memoriae quindi selezionare Avvia.
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.
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.
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, 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.
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.
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 delle differenze tra snapshot ordinato per differenza nel conteggio totale delle 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 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. |
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 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. | |
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.
Nota
Per il codice .NET, l'icona
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
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.
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 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 .
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.
Scegliere l'icona delle istanze () 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.
Scegliere Visualizzazione Stacks nella modalità di visualizzazione nella lista 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 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 .
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.
Report di cambiamenti (Diff)
Scegliere il collegamento di modifica in una cella del riquadro snapshot nella pagina di 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 report di confronto per una visualizzazione del 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).