Comprendere e risolvere i problemi relativi alla memoria di Android

La memoria è una risorsa fondamentale e finita sui dispositivi con 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 con buone prestazioni.

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, potrai:

  • Spiegare i concetti fondamentali della memoria di Android, inclusi il modello di processo Zygote e i file mappati in memoria.
  • Distinguere tra Resident Set Size (RSS), Proportional Set Size (PSS) e Unique Set Size (USS).
  • Utilizzare strumenti a riga di comando standard come dumpsys meminfo e showmap per valutare rapidamente la memoria utilizzata.
  • Acquisire e analizzare i dump dell'heap Java utilizzando AHAT per trovare perdite e allocazioni eccessive.
  • Utilizzare Perfetto e heapprofd per profilare la memoria Java e nativa in tutto il sistema.
  • Comprendere gli indicatori di pressione della memoria a livello di sistema, come Pressure Stall Information (PSI), e monitorare l'attività di Low Memory Killer (LMK).
  • Osservare l'attività di recupero a livello di kernel, inclusi lo swap ZRAM e l'eliminazione della cache delle pagine.

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 di Android.
  2. Strumenti di valutazione rapida: utilizzo di meminfo, showmap, e procstats per il triage rapido.
  3. Analisi della memoria Java: approfondimenti sull'heap Java con AHAT.
  4. Bitmap e memoria: comprendere l'impatto delle immagini sulla RAM e utilizzare gli strumenti per profilarle.
  5. Analisi della memoria nativa: profilazione della memoria C/C++ con Perfetto e heapprofd.
  6. WebView e memoria: comprendere l'architettura multi-processo e il footprint della memoria di WebView.
  7. Il codice dell'app è memoria: comprendere l'impatto del caricamento delle classi e del dex bloat sulla RAM.
  8. Thread e memoria: analisi del costo degli stack di thread nativi.
  9. Località della memoria e prestazioni: comprendere in che modo i pattern di accesso ai dati influiscono sulle prestazioni della CPU.
  10. Associazioni di servizi e stati dei processi: comprendere 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: eliminazione e swap: comprendere memcg, charge e recupero proattivo con memory.reclaim.
  13. Interazione tra kswapd e lmkd: comprendere il funzionamento congiunto di kswapd e lmkd in condizioni di pressione.

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 rendimento standard di Android, tra cui Perfetto, dumpsys meminfo, showmap, e AHAT.
  • Privilegi di root: alcuni workflow di diagnostica a livello di sistema (ad esempio l'ispezione della pressione della memoria del kernel o dei contatori PMU hardware) richiedono privilegi di root elevati (adb root) su una build di emulatore o dispositivo userdebug.

Inizia da qui: Concetti fondamentali