In Android puoi registrare diversi tipi di profili di rendimento. La raccolta di un profilo ti aiuta a eseguire il debug dei problemi relativi alla velocità di esecuzione dell'app, alla quantità di memoria utilizzata, alla quantità di energia consumata e altro ancora.
Questo documento descrive i tipi di profili più utili e quando utilizzarli per eseguire il debug dei problemi di prestazioni comuni.
Tracce di sistema

Una traccia di sistema è un profilo potente che contiene informazioni su processi, thread, informazioni sui tempi, esecuzione di CPU e attività ed eventi definiti dal sistema o dall'utente.
Dal punto di vista di un'app, la natura delle informazioni nelle tracce può riguardare un'ampia gamma di aree, tra cui latenza, scatti, memoria, batteria e altro ancora.
Le tracce di sistema contengono i seguenti eventi basati sul codice che possono essere definiti dal sistema o dall'utente. Gli eventi basati sul codice sono eventi che gli utenti possono attivare tramite chiamate di funzioni.
- Sezioni di traccia: rappresentano il tempo che intercorre tra diversi punti del codice. Possono essere aggiunti con le API
Trace.beginSection
eTrace.endSection
. - Contatori di traccia: valori numerici che rappresentano le metriche, ad esempio la dimensione
dell'heap. Possono essere aggiunti con l'API
Trace.setCounter
.
Le tracce di sistema contengono anche metriche che possono essere create da query PerfettoSQL e possono essere utilizzate per eseguire analisi o confrontare le tracce.
Ti consigliamo di utilizzare le tracce di sistema per eseguire le seguenti attività:
Diagnosticare i problemi di latenza. Le tracce di sistema sono ottime per trovare problemi di latenza causati da ritardi, attese o problemi di pianificazione. Altri profiler, come i profili basati su campioni, non forniscono le informazioni sui tempi fornite dalle tracce di sistema.
Trovare i calcoli duplicati. La traccia può rivelare se determinati calcoli vengono ripetuti, il che potrebbe indicare operazioni non necessarie.
Diagnostica i problemi di contesa dei blocchi. Grazie alle informazioni sugli stati dei thread e alle sezioni che mostrano quando le risorse sono bloccate, puoi identificare se i blocchi (come i blocchi
synchronized
) causano ritardi nei percorsi degli utenti.Comprendi il multithreading nella tua app: le tracce offrono una visualizzazione di più thread, mostrando lo stato di ciascun thread e le sezioni di traccia aggiunte dal sistema o dalla tua app. Questa visualizzazione multithread ti aiuta a capire quali thread sono attivi, inattivi o cosa stanno eseguendo e come interagiscono.
Esegui analisi complesse delle prestazioni. La potente interfaccia utente e la possibilità di visualizzare vari tipi di informazioni rendono le tracce di sistema utili per il debug di un'ampia gamma di problemi di prestazioni, tra cui latenza, memoria e utilizzo della batteria.
Le tracce di sistema supportano anche le query utilizzando PerfettoSQL. Questa potente funzionalità ti consente di:
- Estrai dati specifici.
- Trasforma i dati di traccia in metriche personalizzate.
- Crea tracce di debug dalle query per visualizzare più facilmente gli elementi che ti interessano di più nell'interfaccia utente di Perfetto.
- Esegui analisi complesse direttamente nell'interfaccia utente di Perfetto.
Profili di esempio dello stack

I profili di esempio dello stack funzionano registrando campioni di esecuzione del codice e memorizzando le informazioni sullo stack di chiamate a una velocità impostata mentre un thread esegue attività sulla CPU. In questo modo, puoi ottenere informazioni dettagliate su cosa fa il tuo codice durante l'esecuzione.
Ti consigliamo di utilizzare gli esempi di stack per:
- Ottimizza gli hotspot. I campioni di stack aiutano a identificare le parti del codice con molta attività della CPU, il che significa che il thread è spesso in stato "in esecuzione".
- Comprendere l'esecuzione del codice. I campioni di stack possono aiutarti a comprendere il comportamento generale del tuo codebase.
- Identifica il codice che non deve essere eseguito. Potresti trovare stack di chiamate che non avrebbero dovuto essere eseguiti, il che indica opportunità immediate di ottimizzazione.
Dump dell'heap

I dump dell'heap Java mostrano un'istantanea della memoria heap Java della tua app. Questo snapshot include tutti gli oggetti e il modo in cui si riferiscono l'uno all'altro al momento dell'acquisizione del dump.
Ti consigliamo di raccogliere i dump dell'heap per:
- Scopri gli oggetti duplicati. I dump dell'heap mostrano il numero di oggetti attivi, utile per monitorare gli oggetti duplicati. Forniscono anche riferimenti agli oggetti, aiutandoti a individuare la posizione del codice in cui sono stati creati.
- Trovare perdite di memoria. I dump dell'heap possono rivelare la memoria che non dovrebbe più essere in uso al momento dell'acquisizione del dump, indicando potenziali perdite di memoria.
- Identifica gli oggetti che potrebbero essere ottimizzati. Mostrando gli oggetti che utilizzano molta memoria e i relativi conteggi, i dump dell'heap aiutano a identificare modelli di utilizzo inefficienti della memoria.
Profili heap

I profili heap sono disponibili sia in versione nativa che Java e sono eccellenti per il debug dei problemi di memoria. Sono simili ai campioni dello stack di chiamate, ma invece di misurare i cicli della CPU, vengono prelevati campioni quando viene allocata la memoria.
Ti consigliamo di utilizzare i profili heap per:
- Ridurre la saturazione della memoria. I profili heap forniscono campioni con posizioni del codice per le allocazioni di memoria. In questo modo, puoi identificare le aree che creano molti oggetti temporanei, che possono contribuire a frequenti Garbage Collection (GC) nella tua app.
- Scopri le perdite di memoria. I profili heap possono essere utilizzati con altri profili di memoria per diagnosticare e correggere le perdite di memoria. Ti aiutano a individuare le posizioni che allocano molta più memoria del previsto.
Combinare i profili
Spesso, analizzerai il rendimento utilizzando un singolo profilo. Tuttavia, la raccolta di più profili o di un singolo profilo combinato può spesso fornire un quadro più completo e aiutare a diagnosticare problemi complessi che un singolo profilo non può risolvere.
Prendi in considerazione questi scenari in cui la combinazione dei profili è vantaggiosa:
Scenario 1: esaminare il codice non strumentato. Una traccia di sistema potrebbe mostrare la latenza per le operazioni che hai già instrumentato. Tuttavia, potresti aver bisogno di maggiori informazioni sulle parti non strumentate del codice in esecuzione durante questi periodi. Per analizzare il problema, crea un profilo dello stack di chiamate per comprendere il codice eseguito. Queste informazioni possono quindi aiutarti a migliorare la tracciabilità aggiungendo altre sezioni di traccia.
Scenario 2: analisi delle perdite di memoria e delle operazioni di garbage collection. Immagina che una traccia di sistema mostri un aumento costante della memoria heap Java a causa delle allocazioni, attivando frequenti garbage collection (GC). Per comprendere gli oggetti allocati, crea un profilo heap o un dump dell'heap. Questo approccio combinato ti aiuta a identificare i modi per ridurre l'utilizzo della memoria. Ad esempio, ridurre le allocazioni inutili o ottimizzabili utilizzando la memorizzazione nella cache potrebbe impedire l'esecuzione di GC.