Comprendere e risolvere i problemi relativi alla memoria di Android

La memoria è una risorsa fondamentale e limitata sui dispositivi Android. In qualità di sviluppatore della piattaforma Android o OEM, comprendere il funzionamento della memoria a ogni livello, dal runtime Java al kernel Linux, è essenziale per creare un sistema stabile e dalle prestazioni elevate.

Questa guida fornisce una panoramica completa dell'architettura della memoria di Android, degli strumenti disponibili per l'analisi e degli esercizi pratici per aiutarti a identificare e risolvere i problemi relativi alla memoria.

Obiettivi

Dopo aver completato questa guida, sarai in grado di:

  • Spiegare i concetti fondamentali della memoria Android, inclusi il modello di processo Zygote e i file mappati in memoria.
  • Differenziare tra Resident Set Size (RSS), Proportional Set Size (PSS) e Unique Set Size (USS).
  • Utilizza strumenti a riga di comando standard come dumpsys meminfo e showmap per valutare rapidamente la memoria utilizzata.
  • Acquisisci e analizza i dump dell'heap Java utilizzando AHAT per trovare perdite e allocazioni eccessive.
  • Utilizza Perfetto e heapprofd per profilare la memoria Java e nativa in tutto il sistema.
  • Comprendi gli indicatori di pressione della memoria a livello di sistema, come le informazioni sulla pressione di stallo (PSI), e monitora l'attività di interruzione per memoria insufficiente (LMK).
  • Osserva l'attività di recupero a livello di kernel, tra cui lo scambio ZRAM e l'eliminazione della cache della pagina.

Struttura della guida

Questa guida è suddivisa nelle seguenti sezioni, progettate per essere lette in sequenza:

  1. Concetti fondamentali: i principi tecnici di base della memoria Android.
  2. Strumenti di valutazione rapida: utilizzo di meminfo, showmap e procstats per un triage rapido.
  3. Analisi della memoria Java: approfondimenti sull'heap Java con AHAT.
  4. Bitmap e memoria: scopri in che modo le immagini influiscono sulla RAM e utilizza gli strumenti per profilarle.
  5. Analisi della memoria nativa: profilazione della memoria C/C++ con Perfetto e heapprofd.
  6. WebView e memoria: scopri l'architettura multiprocesso e il footprint della memoria di WebView.
  7. Il codice dell'app è memoria: scopri in che modo il caricamento delle classi e il dex bloat influiscono sulla RAM.
  8. Thread e memoria: analisi del costo degli stack di thread nativi.
  9. Località e prestazioni della memoria: scopri in che modo i pattern di accesso ai dati influiscono sulle prestazioni della CPU.
  10. Associazioni di servizi e stati dei processi: scopri in che modo le dipendenze tra processi influiscono sui punteggi OOM.
  11. Risoluzione dei problemi a livello di sistema: monitoraggio di PSI, LMK, swap ZRAM ed eliminazione della cache delle pagine.
  12. Recupero della memoria: espulsione e swap: informazioni su memcg, carica e recupero proattivo con memory.reclaim.
  13. Interazione tra kswapd e lmkd: comprendere come kswapd e lmkd interagiscono sotto pressione.
  14. Restituzione delle pagine di memoria al sistema operativo: utilizza madvise e posix_fadvise per restituire le pagine heap e le pagine della cache dei file inutilizzate al kernel.
  15. Mantieni attivo il lavoro in background con un processo snello: sposta i servizi in background e i worker in un processo dedicato in modo che la memoria video e dell'interfaccia utente non venga mantenuta con priorità elevata.

Prerequisiti e ambiente

Questa guida presenta workflow di riferimento, dati di benchmark e case study che mostrano come diagnosticare e risolvere i problemi di memoria di Android.

  • Strumenti di analisi: le tecniche descritte in questa guida utilizzano principalmente gli strumenti di prestazioni Android standard, tra cui Perfetto, dumpsys meminfo, showmap e AHAT.
  • Privilegi root: alcuni workflow di diagnostica a livello di sistema (ad esempio l'ispezione della pressione della memoria del kernel o dei contatori PMU dell'hardware) richiedono privilegi root elevati (adb root) su un dispositivo userdebug o su una build dell'emulatore.

Inizia da qui: concetti fondamentali