App che consumano molta memoria

La piattaforma Android si basa sul presupposto che la memoria libera sia memoria sprecata. Android cerca di utilizzare sempre tutta la memoria disponibile. Ad esempio, il sistema mantiene le app in memoria dopo che sono state chiuse in modo che l'utente possa tornare rapidamente a usarle. Per questo motivo, i dispositivi Android spesso funzionano con pochissima memoria libera (vedi Allocazione della memoria Android qui).

Il processo del demone LMK (low memory killer) di Android monitora lo stato della memoria di un sistema Android in esecuzione e reagisce a un carico elevato della memoria terminando i processi meno essenziali per mantenere le prestazioni del sistema a livelli accettabili.

Per decidere quale processo terminare, il daemon LMK utilizza un punteggio di mancata disponibilità di memoria chiamato oom_adj_score per assegnare la priorità ai processi in esecuzione. I processi con un punteggio elevato vengono interrotti per primi. Le app in background vengono terminate per prime e i processi di sistema per ultimi. Nella tabella seguente sono elencate le categorie di punteggio LMK dal più alto al più basso. Gli elementi della categoria con il punteggio più alto, nella prima riga, vengono eliminati per primi:

Processi Android classificati dal punteggio più alto al più basso: app in background, app precedente, app Home,
             servizi, app percepibili, app in primo piano, persistenti, di sistema e native.
Figura 1. Processi Android, con punteggi elevati in alto e punteggi bassi in basso.

Metrica LMK in Android vitals

Android vitals può aiutarti a monitorare e migliorare il tasso LMK della tua app. Android vitals misura un'unica percentuale di errori LMK: la percentuale di errori LMK percepiti dall'utente.

La metrica riflette la percentuale di utenti attivi giornalieri che hanno riscontrato almeno un'interruzione per memoria insufficiente (LMK) percepita dall'utente. Un errore LMK percepito dall'utente è un errore LMK che probabilmente è stato notato dall'utente. Ad esempio, le interruzioni per memoria insufficiente che si verificano quando la tua app mostra un'attività o è in esecuzione come servizio in primo piano.

Puoi trovare la metrica nella sezione Stabilità di Android vitals:

Figura 2. Accedi alla percentuale di errori LMK percepiti dall'utente in Android vitals.

Come per altre metriche vitali di base, come ANR e arresti anomali, puoi filtrare le metriche, confrontarle con quelle di un'app simile o monitorare la variazione della metrica per un lungo periodo di tempo (fino a 3 anni). I dati sono disponibili per le app esistenti a partire dal 28 gennaio 2025.

Figura 3. Panoramica della percentuale di errori LMK in Android Vitals.

Strumenti di profilazione della memoria

I seguenti strumenti possono aiutarti a trovare e diagnosticare i problemi di memoria nei seguenti modi:

  • Scopri come la tua app alloca la memoria nel tempo. Puoi trovare un grafico in tempo reale della quantità di memoria utilizzata dalla tua app, del numero di oggetti Java allocati e del momento in cui avviene il garbage collection.
  • Avvia gli eventi di raccolta dei rifiuti e acquisisci un'istantanea dell'heap Java durante l'esecuzione dell'app.
  • Registra le allocazioni di memoria dell'app, ispeziona tutti gli oggetti allocati e visualizza la traccia dello stack per ogni allocazione.

Memory Profiler di Android Studio

Android Studio fornisce Memory Profiler come componente di Android Profiler, che consente di identificare perdite di memoria e svuotamento della memoria che possono causare balbuzie, blocchi e persino arresti anomali dell'app. Il profiler mostra un grafico in tempo reale dell'utilizzo della memoria della tua app e ti consente di acquisire un dump dell'heap, forzare la raccolta dei rifiuti e monitorare l'allocazione della memoria.

Figura 4. Visualizzazione dei riferimenti JNI globali in Android Studio Memory Profiler.

Strumenti di profilazione della memoria di Unity

Se utilizzi Unity Engine per creare le tue app, puoi seguire le linee guida per il profiling della memoria di Unity. Unity offre due strumenti per analizzare l'utilizzo della memoria nella tua applicazione.

Il primo è il modulo Profiler della memoria, che è un profiler integrato che fornisce informazioni di base su dove l'applicazione utilizza la memoria.

Il modulo Memoria mostra le allocazioni di memoria, ad esempio la memoria delle texture e la memoria del mesh.
Figura 5. Finestra di Unity Profiler con il modulo Memoria selezionato.

Il secondo strumento è il pacchetto Memory Profiler, che è un pacchetto Unity che puoi aggiungere al tuo progetto. Il pacchetto aggiunge un'altra finestra di Memory Profiler a Unity Editor. Memory Profiler ti consente di analizzare l'utilizzo della memoria nella tua applicazione in modo ancora più dettagliato. Puoi memorizzare e confrontare gli snapshot per trovare perdite di memoria o visualizzare il layout della memoria per trovare problemi di frammentazione della memoria.

Figura 6. Analisi di uno snapshot della memoria utilizzando la finestra di Profiler della memoria.

Unreal Memory Insights

Le app create con Unreal Engine possono utilizzare Unreal Memory Insights per visualizzare informazioni dettagliate sull'allocazione e sulla deallocazione della memoria, inclusi i tag LLM (Low Level Memory) e le callstack associate ai blocchi di memoria.

Il sistema di query di Approfondimenti sulla memoria può trovare le allocazioni attive in qualsiasi momento, identificare le variazioni nell'utilizzo della memoria, individuare le perdite di memoria e differenziare le allocazioni a breve termine da quelle a lungo termine.

A partire da UE 5.4, gli Approfondimenti sulla memoria supportano il monitoraggio della memoria con gli stack chiamate per i progetti Android.

Tracker di Approfondimenti sulla memoria che mostra il grafico della memoria principale, il conteggio delle allocazioni in tempo reale e il conteggio degli eventi alloc/free.
Figura 6. Il tracker di Unreal Memory Insights.

Risorse aggiuntive