Memoria utilizzata (RSS anonimo + swap) è una metrica che riflette l'utilizzo di memoria della tua app.
La memoria anonima è una memoria non supportata da un file nello spazio di archiviazione, ad esempio allocazioni heap e memoria allocata con mmap. Vengono acquisite le allocazioni di memoria dinamica dell'app, inclusi l'heap Java o Kotlin, le allocazioni dell'heap nativo non gestito (dove si trovano i dati dei pixel Bitmap su Android 8.0 (livello API 26) e versioni successive) e gli stack di esecuzione dei thread. Anche se il sistema operativo può eliminare la memoria supportata da file in caso di necessità, non può eliminare la memoria anonima.
Resident Set Size (RSS) è il numero totale di pagine di memoria (sia condivise che non condivise) utilizzate da un processo che vengono mantenute nella RAM fisica. Una pagina è considerata "condivisa" se viene utilizzata da più processi (ad esempio app che accedono alla stessa libreria).
Per la memoria anonima, il sistema può scrivere pagine nello spazio di swap (o zRAM su Android) quando la memoria è sotto pressione. Se necessario, il sistema può rileggere queste pagine dallo swap.
L'utilizzo totale della memoria (RSS anonimo + swap) è una misura del numero totale di pagine di memoria della tua app non supportate da un file nello spazio di archiviazione, inclusa qualsiasi memoria conservata anche dal sistema nello swap. Il monitoraggio dell'RSS anonimo + swap ti consente di visualizzare il footprint della memoria effettivo e non eliminabile della tua app.
Se la memoria utilizzata dalla tua app è elevata, esamina ulteriormente il problema e risolvilo seguendo le indicazioni riportate in questa pagina.
Risorse
Diagnosticare l'utilizzo eccessivo della memoria utilizzata in locale
Per iniziare a diagnosticare l'origine della memoria utilizzata in modo eccessivo, puoi acquisire un dump dell'heap con Registra dump dell'heap nelle impostazioni sviluppatore, Android Studio o Perfetto. Ti consigliamo di iniziare acquisendo un dump dell'heap in locale dopo aver testato i percorsi utente principali della tua app.
Ti consigliamo in particolare di testare i seguenti percorsi utente:
- WebView e sessioni del browser in-app
- Scorrimento continuo con molti contenuti multimediali
- Flussi di creazione e modifica degli asset
Per analizzare potenziali perdite di memoria, esegui i percorsi utente corrispondenti
in locale e raccogli i dump dell'heap in diversi stati del processo (visibile,
servizio in primo piano e memorizzato nella cache) per verificare se l'app rilascia memoria dopo
essere stata messa in background. Per capire come questi stati di elaborazione sono correlati ai
callback onTrimMemory, consulta le indicazioni su come liberare memoria in risposta
agli eventi.
Se esegui il debug dei problemi di memoria utilizzando Android Studio Profiler, puoi anche utilizzare l'integrazione di LeakCanary per semplificare il rilevamento di perdite e duplicati di bitmap per ottimizzare l'utilizzo delle immagini.
Dopo aver raccolto il dump dell'heap, ti consigliamo di utilizzare la skill Profiler Android per analizzare il dump dell'heap e identificare le potenziali fonti di memoria utilizzata elevata.
Competenze Android
Visualizza su GitHubProfiler Android
android skills add android-profilerEcco un esempio di risposta che le skill di AI potrebbero fornire:
I have completed the analysis of memory leaks and bitmap issues for [app] using the provided Perfetto trace.
Summary of Findings
The investigation identified a critical memory pressure issue caused by massive bitmap retention within the app process.
...
Recommendations for [app]
1. [Library] Image Cache Optimization:
* Review the [Library] caching strategy. Ensure that bitmaps
loaded for animations are released or downsampled when the animation is
not in the foreground.
2. Asset Resolution Audit:
* The 14.7 MB average size suggests full-screen or extremely high-density assets. Audit the [library] files in the native_home component to ensure they are not using unnecessarily large source images.
3. View Lifecycle Management:
* Investigate why 21 [LibraryImage] instances are alive simultaneously. Ensure that views in the bottom
tab are properly detached or their animations are cleared when switching between tabs.
4. Fix Surface Leaks:
* Address the Surface.release failures observed in the logs, as these can lead to both memory leaks and
native resource exhaustion.
Risorse aggiuntive per l'interpretazione dei dump dell'heap
Le seguenti risorse forniscono ulteriori informazioni sull'interpretazione dei dump dell'heap e sul debug della memoria utilizzata:
- Analisi manuale:utilizza le indicazioni di Perfetto Heap Dump Explorer per scoprire come navigare e interpretare le visualizzazioni dei dump dell'heap nell'interfaccia utente di Perfetto.
- Allocazioni Java/Kotlin:leggi Visualizzare il primo dump dell'heap ART per una procedura dettagliata passo passo per analizzare i dump dell'heap Android Runtime (ART).
- Allocazioni native:consulta la documentazione relativa al profiling nativo di Perfetto per scoprire come raccogliere e analizzare i profili di memoria nativi (C/C++).
- Ispezione della CLI:utilizza adb dumpsys meminfo per ottenere una rapida suddivisione della memoria utilizzata dalla tua app su un dispositivo.
Migliorare l'utilizzo della memoria
Consulta queste sezioni per scoprire di più su come migliorare l'utilizzo della memoria della tua app:
- Ridurre il footprint del codice e delle risorse dell'app
- Monitorare la memoria disponibile e la memoria utilizzata
- Utilizzare costrutti di codice più efficienti in termini di memoria
Per indicazioni dettagliate sulla risoluzione dei problemi di memoria, consulta la guida Gestire la memoria dell'app.