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 meminfoeshowmapper valutare rapidamente la memoria utilizzata. - Acquisisci e analizza i dump dell'heap Java utilizzando AHAT per trovare perdite e allocazioni eccessive.
- Utilizza Perfetto e
heapprofdper 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:
- Concetti fondamentali: i principi tecnici di base della memoria Android.
- Strumenti di valutazione rapida: utilizzo di
meminfo,showmapeprocstatsper un triage rapido. - Analisi della memoria Java: approfondimenti sull'heap Java con AHAT.
- Bitmap e memoria: scopri in che modo le immagini influiscono sulla RAM e utilizza gli strumenti per profilarle.
- Analisi della memoria nativa: profilazione della memoria C/C++ con Perfetto e
heapprofd. - WebView e memoria: scopri l'architettura multiprocesso e il footprint della memoria di WebView.
- Il codice dell'app è memoria: scopri in che modo il caricamento delle classi e il dex bloat influiscono sulla RAM.
- Thread e memoria: analisi del costo degli stack di thread nativi.
- Località e prestazioni della memoria: scopri in che modo i pattern di accesso ai dati influiscono sulle prestazioni della CPU.
- Associazioni di servizi e stati dei processi: scopri in che modo le dipendenze tra processi influiscono sui punteggi OOM.
- Risoluzione dei problemi a livello di sistema: monitoraggio di PSI, LMK, swap ZRAM ed eliminazione della cache delle pagine.
- Recupero della memoria: espulsione e swap: informazioni su memcg,
carica e recupero proattivo con
memory.reclaim. - Interazione tra kswapd e lmkd: comprendere come kswapd e lmkd interagiscono sotto pressione.
- Restituzione delle pagine di memoria al sistema operativo: utilizza
madviseeposix_fadviseper restituire le pagine heap e le pagine della cache dei file inutilizzate al kernel. - 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,showmape 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