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 interrotte per prime, followed by the system processes. 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:

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:

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.

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.

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 Memory Profiler, che è un profiler integrato che fornisce informazioni di base su dove l'applicazione utilizza la memoria.

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.

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.

Approfondimenti sulla memoria insufficiente
Android fornisce callback e API che ti consentono di ridurre i requisiti di memoria del gioco e di determinare il motivo per cui le esecuzioni precedenti del gioco sono state interrotte.
Callback
Non registrarti per i callback trim ritirati. Android non dispone di API per il rilevamento di eventi di pressione della memoria nativa quando il sistema raggiunge i limiti di memoria.
I richiami di Trim non sono stati utili per evitare l'interruzione a causa di poca memoria, quindi Android li ha ritirati tutti, ad eccezione di TRIM_MEMORY_UI_HIDDEN
e TRIM_MEMORY_BACKGROUND
.
Risoluzione del rapporto di partnership.
Android tenta di utilizzare tutta la memoria disponibile per memorizzare nella cache app e giochi per assicurarsi che si caricino rapidamente (migliorando l'esperienza utente), ma quando la memoria diventa limitata, il sistema chiude le app e i giochi che richiedono più memoria per liberare memoria per il normale funzionamento del dispositivo.
Informazioni, approfondimenti e best practice per aiutarti a migliorare l'utilizzo della memoria del gioco includono quanto segue:
- Utilizza
ApplicationExitInfo
: questa API restituisce il motivo per cui la esecuzione precedente della partita è stata interrotta dal sistema Android. UtilizzaApplicationExitInfo
per verificare se la memoria è insufficiente come motivo di un precedente arresto dell'esecuzione del processo. Controlla se il gioco è stato interrotto a causa di una memoria insufficiente in modo da poterlo ottimizzare per utilizzare meno memoria sul dispositivo. - Esamina la RAM fisica totale:
per evitare che i giochi vengano chiusi quando sono in primo piano e per adattarli alle funzionalità del dispositivo, esamina la RAM fisica totale per dispositivo per una granularità fine e regola di conseguenza l'utilizzo della memoria del gioco. Se l'obiettivo è impedire l'interruzione delle app poco dopo il passaggio in background (per consentire al giocatore di eseguire il multitasking), utilizza i callback trim (in particolare
TRIM_MEMORY_UI_HIDDEN
) per ridurre l'utilizzo della memoria del gioco.