Acquisisci un dump dell'heap

Acquisisci un dump dell'heap per vedere quali oggetti della tua app stanno utilizzando la memoria al momento dell'acquisizione e identifica le perdite di memoria o il comportamento di allocazione della memoria che porta a balbuzie, blocchi e persino arresti anomali dell'app. È particolarmente utile esegue i dump dell'heap dopo una sessione utente estesa, quando poteva mostrare oggetti ancora in memoria che non dovrebbero più essere presenti.

Questa pagina descrive gli strumenti forniti da Android Studio per raccogliere e analizzare i dump dell'heap. In alternativa, puoi controllare la memoria dell'app dal riga di comando con dumpsys e anche vedi Eventi di garbage collection (GC) in Logcat.

Perché dovresti profilare la memoria dell'app

Android offre una memoria gestita dell'ambiente di rete, quando Android determina che l'app non utilizza più alcuni oggetti, il garbage collector rilascia di memoria inutilizzata, di nuovo nell'heap. In che modo Android trova la memoria inutilizzata viene costantemente migliorato, ma a un certo punto su tutte le versioni di Android, il sistema mettere in pausa brevemente il codice. La maggior parte delle volte le pause sono impercettibili. Tuttavia, se l'app alloca la memoria più velocemente di quanto il sistema possa raccoglierla, l'app potrebbe subire un ritardo mentre il raccoglitore libera memoria sufficiente per soddisfare le tue allocazioni. Il ritardo potrebbe causare l'esclusione dei frame da parte dell'app una lentezza visibile.

Anche se la tua app non presenta rallentamenti, se perde memoria, può mantenere quel ricordo anche quando è in background. Questo comportamento può rallentare il resto delle prestazioni della memoria del sistema forzando eventi di raccolta del garbage non necessari. Alla fine, il sistema sarà costretto a terminare il processo dell'app per recuperare la memoria. Quando l'utente torna nella tua app, il processo dell'app deve riavviarsi. completamente.

Per informazioni sulle pratiche di programmazione che possono ridurre la memoria della tua app consulta l'articolo Gestire la memoria dell'app.

Panoramica dei dump dell'heap

Per acquisire un dump dell'heap, seleziona l'attività Analizza l'utilizzo della memoria (heap) (utilizza Profiler: esegui "app" come elemento di debug (dati completi)) per acquisire un heap il dump. Durante il dump dello heap, la quantità di memoria Java potrebbe aumentare temporaneamente. Questo è normale perché il dump dell'heap si verifica nello stesso processo del la tua app e richiede un po' di memoria per raccogliere i dati. Dopo aver acquisito il dump heap, viene visualizzato quanto segue:

L'elenco dei corsi mostra le seguenti informazioni:

  • Allocations: numero di allocazioni nell'heap.
  • Dimensioni native: quantità totale di memoria nativa utilizzata da questo tipo di oggetto (in byte). Qui vedrai la memoria per alcuni oggetti allocati in Java perché Android utilizza la memoria nativa per alcune classi di framework, ad esempio Bitmap

  • Dimensioni ridotte: quantità totale di memoria Java utilizzata da questo tipo di oggetto (in byte).

  • Dimensioni mantenuta: dimensione totale della memoria che viene mantenuta a causa di tutte le istanze questa classe (in byte).

Utilizza il menu cumulo per filtrare in base a determinati cumuli:

  • heap dell'app (predefinito): l'heap principale su cui l'app alloca la memoria.
  • Heap di immagini: l'immagine di avvio del sistema, contenente le classi precaricate durante l'avvio. Le allocazioni qui non vengono spostate né scomparse.
  • heap Zygote: l'heap di copia alla scrittura da cui viene generato il fork di un processo di un'app. il sistema Android.

Utilizza il menu a discesa degli accordi per scegliere come organizzare le allocazioni:

  • Ordina per classe (impostazione predefinita): raggruppa tutte le allocazioni in base al nome della classe.
  • Ordina per pacchetto: raggruppa tutte le allocazioni in base al nome del pacchetto.

Utilizza il menu a discesa dei corsi per filtrare i risultati in base a gruppi di corsi:

  • Tutti i moduli (predefinito): mostra tutti i moduli, inclusi quelli delle librerie e delle dipendenze.
  • Mostra fughe di attività/frammenti: mostra le classi che causano perdite di memoria.
  • Mostra i corsi del progetto: mostra solo i corsi definiti dal progetto.

Fai clic sul nome di un corso per aprire il riquadro Istanza. Ogni istanza elencata include le seguenti:

  • Profondità: il numero più breve di hop da qualsiasi radice GC al valore selezionato in esecuzione in un'istanza Compute Engine.
  • Dimensione nativa: dimensione di questa istanza in memoria nativa. Questa colonna è visibile solo per Android 7.0 e versioni successive.
  • Dimensioni ridotte: dimensioni di questa istanza nella memoria Java.
  • Dimensione residua: dimensione della memoria dominata da questa istanza (in base all'albero dei dominatori).

Fai clic su un'istanza per visualizzare i Dettagli dell'istanza, inclusi i Campi e i Riferimenti. I tipi di campi e di riferimento comuni sono tipi strutturati , array , e i tipi di dati primitivi in Java. Fai clic con il tasto destro del mouse su un campo o un riferimento per passare all'istanza o alla riga associata nel codice sorgente.

  • Campi: mostra tutti i campi di questa istanza.
  • Riferimenti: mostra tutti i riferimenti all'oggetto evidenziato nella scheda Istanza.

Trova fughe di memoria

Per filtrare rapidamente i componenti che potrebbero essere associati a perdite di memoria, apri il menu a discesa del componente e seleziona Mostra perdite di attività/componenti. Android Studio mostra le classi che ritiene indichino perdite di memoria per le istanze Activity e Fragment nella tua app. I tipi di dati visualizzati dal filtro includono:

  • Activity istanze che sono state eliminate, ma a cui viene ancora fatto riferimento.
  • Istanze Fragment che non hanno un valore FragmentManager valido, ma a cui viene comunque fatto riferimento.

Tieni presente che il filtro potrebbe produrre falsi positivi nei seguenti situazioni seguenti:

  • Un Fragment è stato creato, ma non è ancora stato utilizzato.
  • Un Fragment viene memorizzato nella cache, ma non nell'ambito di un FragmentTransaction.

Per cercare più manualmente le fughe di memoria, sfoglia gli elenchi di classi e istanze per Trova oggetti con Dimensioni mantenuta grande. Cerca eventuali fughe di memoria causate dei seguenti:

  • Riferimenti a lungo termine a Activity, Context, View, Drawable e altri oggetti che potrebbero contenere un riferimento al contenitore Activity o Context.
  • Classi interne non statiche, ad esempio un Runnable, che possono contenere un'istanza Activity.
  • Cache che contengono gli oggetti più a lungo del necessario.

Quando rilevi potenziali perdite di memoria, utilizza le schede Campi e Riferimenti. in Dettagli istanza per passare all'istanza o alla riga del codice sorgente che ti interessa.

Attivare le perdite di memoria per i test

Per analizzare l'utilizzo della memoria, devi sottoporre a stress il codice dell'app e provare a forzare le perdite di memoria. Un modo per provocare perdite di memoria nell'app è lasciarla in esecuzione per un po' di tempo prima di ispezionare l'heap. Le perdite potrebbero risalire fino alla parte superiore delle allocazioni nella heap. Tuttavia, minore è la perdita, maggiore sarà il tempo necessario per eseguire l'app per vederla.

Puoi anche attivare una fuga di memoria in uno dei seguenti modi:

  • Ruota il dispositivo più volte da verticale a orizzontale e viceversa mentre si trovano in stati di attività diversi. La rotazione del dispositivo può spesso causare la perdita di un oggetto Activity, Context o View da parte di un'app perché il sistema ricrea Activity e, se la tua app contiene un riferimento a uno di questi oggetti altrove, il sistema non può eseguire la raccolta dei rifiuti.
  • Passare dalla tua app a un'altra app in stati di attività diversi. Ad esempio, vai alla schermata Home, poi torna all'app.

Esporta e importa una registrazione di dump dell'heap

Puoi esportare e importare un file dump heap dalla scheda Registrazioni passate nel profiler. Android Studio salva registrazione come file .hprof.

In alternativa, per utilizzare un altro analizzatore di file .hprof come jhat, devi convertire il file .hprof dal formato Android al formato file Java SE.hprof. Per convertire il formato del file, utilizza lo strumento hprof-conv fornito nella directory {android_sdk}/platform-tools/. Esegui hprof-conv con due argomenti: il nome file .hprof originale e la posizione in scrivi il file .hprof convertito, incluso il nuovo nome file .hprof. Per esempio:

hprof-conv heap-original.hprof heap-converted.hprof