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 meminfoeshowmapper valutare rapidamente la memoria utilizzata. - Acquisire e analizzare i dump dell'heap Java utilizzando AHAT per trovare perdite e allocazioni eccessive.
- Utilizzare Perfetto e
heapprofdper 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:
- Concetti fondamentali: i principi tecnici di base della memoria di Android.
- Strumenti di valutazione rapida: utilizzo di
meminfo,showmap, eprocstatsper il triage rapido. - Analisi della memoria Java: approfondimenti sull'heap Java con AHAT.
- Bitmap e memoria: comprendere l'impatto delle immagini sulla RAM e utilizzare gli strumenti per profilarle.
- Analisi della memoria nativa: profilazione della memoria C/C++ con
Perfetto e
heapprofd. - WebView e memoria: comprendere l'architettura multi-processo e il footprint della memoria di WebView.
- Il codice dell'app è memoria: comprendere l'impatto del caricamento delle classi e del dex bloat sulla RAM.
- Thread e memoria: analisi del costo degli stack di thread nativi.
- Località della memoria e prestazioni: comprendere in che modo i pattern di accesso ai dati influiscono sulle prestazioni della CPU.
- Associazioni di servizi e stati dei processi: comprendere 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: eliminazione e swap: comprendere memcg,
charge e recupero proattivo con
memory.reclaim. - 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