Se la tua app è lenta su alcuni dispositivi o le funzioni Instant Run di Android Studio smettono di funzionare a caso, allora potresti avere delle perdite di memoria.
Quando avviene una perdita di memoria?
Una delle grandi cose di Java è il garbage collector (GC). Un garbage collector viene eseguito periodicamente per controllare gli oggetti che non sono in uso e li rimuove. Una perdita di memoria avverrà quando ci sono oggetti che non sono in uso dall’applicazione ma il garbage collector non può riconoscerli. Quindi, rimarranno in memoria inutilizzati, riducendo la quantità di memoria disponibile per l’applicazione, il che causa risultati inaspettati.
Come rilevare le perdite di memoria?
Ci sono diversi modi per farlo. Ne copriremo alcuni in questo articolo.
Ma prima, scriviamo del codice che potrebbe produrre una perdita di memoria. Creeremo un’applicazione con due attività. L’attività A avrà un pulsante che apre l’attività B. Insieme a questo, creeremo anche una classe singleton che contiene un riferimento statico di un Context.
class Manager {
private static Manager ourInstance;
private Context context;
static Manager getInstance(Context context) {
if (ourInstance == null) {
ourInstance = new Manager(context);
}
return ourInstance;
}
private Manager(Context context) {
this.context = context;
}
}
Chiameremo questo singleton dall’attività A
Manager.getInstance(this);
Detecting Memory Leaks Using Android Studio’s Monitors
Android Studio fornisce strumenti utili per il profiling delle prestazioni della vostra app, e uno di questi è il Memory Monitor. Possiamo usare il Memory Monitor per rilevare le perdite di memoria attraverso i seguenti passi:
1. Esegui la tua app sul tuo dispositivo mobile o su un emulatore.
2. Apri Android Monitor (Premi Cmd + 6 in Mac o Alt + 6 in Windows). Nella parte superiore di Memory Monitor, fare clic su Start Allocation Tracking.
3. Utilizzare l’app intorno alla parte che si sospetta possa avere una perdita di memoria. Nel nostro esempio, andremo in un’altra attività.
4. Cliccate su Initiate GC per forzare il garbage collector a iniziare a raccogliere gli oggetti che non sono attualmente in uso e rimuoverli. Dovreste vedere il grafico della memoria diminuire un po’.
5. Cliccate su Dump Java Heap per lasciare che Android Studio generi un file .hprof che contiene un’istantanea dell’heap. Il modo più semplice per controllare una perdita di memoria è usando Analyzer Tasks
6. Aprite la scheda Analyzer Tasks e poi cliccate su Run nella parte superiore di questa scheda. Dovresti vedere le attività trapelate nella scheda Analysis Results sotto la scheda Analyzer Tasks.
Detecting Memory Leaks Using Leak Canary
Leak Canary è una libreria fatta da Square ed è un modo molto veloce per rilevare le perdite di memoria. Leak Canary ti permette di rilevare le perdite di memoria in tempi più lunghi perché non hai bisogno di collegare il tuo dispositivo ad Android Studio e monitorare la tua app per un lungo periodo di tempo. Leak Canary ti invierà delle notifiche ogni volta che c’è una perdita di memoria.
L’integrazione di Leak Canary è davvero facile. Tutto quello che dovete fare è aggiungere quanto segue al vostro file build.gradle a livello di app:
dependencies {
debugCompile ‘com.squareup.leakcanary:leakcanary-android:1.5.1’
releaseCompile ‘com.squareup.leakcanary:leakcanary-android-no-op:1.5.1’
testCompile ‘com.squareup.leakcanary:leakcanary-android-no-op:1.5.1’
}
Poi aggiungi il seguente codice alla tua classe Application:
@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// Questo processo è dedicato a LeakCanary per l’analisi dell’heap.
/ Non dovresti avviare la tua app in questo processo.
return;
}
LeakCanary.install(this);
// Normale codice di avvio dell’app…
}
E questo è tutto, puoi andare.
Rilevare possibili perdite con Infer
Infer è uno strumento di analisi statica fatto da Facebook che aiuta a trovare possibili eccezioni di puntatori nulli e perdite di risorse, così come la raggiungibilità delle annotazioni, lock guard mancanti e condizioni di concorrenza. È un buon strumento da aggiungere alla vostra CI per superare tutti i possibili bug. È anche open source, quindi lo sviluppo dello strumento è ancora in evoluzione. Potete trovare maggiori informazioni su Infer nella loro documentazione Quick Start.