Als je app traag is op sommige apparaten of Android Studio’s Instant Run functies stoppen willekeurig met werken, dan heb je misschien te maken met geheugenlekken.
When Does A Memory Leak Happen?
Eén van de goede dingen van Java is de garbage collector (GC). Een garbage collector controleert periodiek objecten die niet in gebruik zijn en verwijdert ze. Een geheugenlek ontstaat wanneer er objecten zijn die niet in gebruik zijn door de app, maar de garbage collector kan ze niet herkennen. Daarom zullen ze ongebruikt in het geheugen blijven, waardoor de hoeveelheid beschikbaar geheugen voor de app afneemt, wat onverwachte resultaten veroorzaakt.
Hoe geheugenlekken te detecteren?
Er zijn verschillende manieren om dit te doen. We gaan er een aantal behandelen in dit artikel.
Maar laten we eerst wat code schrijven die een geheugenlek zou kunnen produceren. We maken een app met twee activiteiten. Activiteit A zal een knop hebben die Activiteit B opent. Hiernaast maken we een singleton klasse die een statische referentie van een Context bevat.
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;
}
}
We gaan deze singleton aanroepen vanuit Activity A
Manager.getInstance(this);
Geheugenlekken opsporen met de monitoren van Android Studio
Android Studio biedt handige hulpmiddelen om de prestaties van uw app te profileren, en een daarvan is de Geheugenmonitor. We kunnen de Memory Monitor gebruiken om geheugenlekken op te sporen aan de hand van de volgende stappen:
1. Start uw app op uw mobiele apparaat of een emulator.
2. Open Android Monitor (Druk op Cmd + 6 in Mac of Alt + 6 in Windows). Aan de bovenkant van Memory Monitor, klik op Start Allocation Tracking.
3. Gebruik de app rond het onderdeel waarvan u vermoedt dat het een geheugenlek kan ondervinden. In ons voorbeeld gaan we naar een andere activiteit.
4. Klik op Initiate GC om de vuilnisman te dwingen te beginnen met het verzamelen van objecten die momenteel niet in gebruik zijn en ze te verwijderen. U zou de geheugengrafiek een beetje moeten zien afnemen.
5. Klik op Dump Java Heap om Android Studio een .hprof bestand te laten genereren dat een heap snapshot bevat. De eenvoudigste manier om een geheugenlek te controleren is met behulp van Analyzer Tasks
6. Open het tabblad Analyzer Tasks en klik vervolgens op Run boven aan dit tabblad. U zou de gelekte activiteiten moeten zien op het tabblad Analyseresultaten onder het tabblad Analyzer Tasks.
Geheugenlekken opsporen met Leak Canary
Leak Canary is een bibliotheek gemaakt door Square en het is een zeer snelle manier om geheugenlekken te detecteren. Leak Canary stelt u in staat om geheugenlekken in langere runs te detecteren omdat u uw apparaat niet hoeft aan te sluiten op de Android Studio en uw app voor een lange periode in de gaten moet houden. Leak Canary stuurt u meldingen wanneer er een geheugenlek is.
Integratie van Leak Canary is echt eenvoudig. Alles wat je hoeft te doen is het volgende toe te voegen aan je app level build.gradle bestand:
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’
}
Dan voeg je de volgende code toe aan je Application class:
@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// Dit proces is toegewijd aan LeakCanary voor heap analyse.
/ U moet uw app niet in dit proces initiëren.
return;
}
LeakCanary.install(this);
/ Normale app init code…
}
En dat is het, je bent klaar om te gaan.
Opsporen van mogelijke lekken met Infer
Infer is een statische analyse tool gemaakt door Facebook die je helpt om mogelijke null pointer uitzonderingen en resource lekken te vinden, evenals annotatie bereikbaarheid, ontbrekende lock guards, en concurrency race condities. Het is een goed hulpmiddel om aan je CI toe te voegen om alle mogelijke bugs op te sporen. Het is ook open source, dus de ontwikkeling van de tool is nog steeds in ontwikkeling. Je kunt meer info over Infer vinden in hun Quick Start documentatie.