Jos sovelluksesi on hidas joillakin laitteilla tai Android Studion Instant Run -ominaisuudet lakkaavat toimimasta satunnaisesti, sinulla saattaa olla muistivuotoja.
Milloin muistivuoto tapahtuu?
Yksi Javan hienoimmista ominaisuuksista on roskienkerääjä. Roskienkerääjä ajetaan määräajoin tarkistamaan objektit, jotka eivät ole käytössä, ja poistaa ne. Muistivuoto tapahtuu, kun on objekteja, jotka eivät ole sovelluksen käytössä, mutta roskienkerääjä ei pysty tunnistamaan niitä. Näin ollen ne jäävät käyttämättöminä muistiin, mikä vähentää sovelluksen käytettävissä olevan muistin määrää, mikä aiheuttaa odottamattomia tuloksia.
Miten havaita muistivuodot?
Muistivuodon havaitsemiseen on useita tapoja. Käsittelemme joitakin niistä tässä artikkelissa.
Mutta ensin kirjoitetaan koodia, joka voisi tuottaa muistivuodon. Luomme sovelluksen, jossa on kaksi aktiviteettia. Aktiviteetissa A on painike, joka avaa aktiviteetin B. Tämän ohella luomme singleton-luokan, joka pitää sisällään staattisen viittauksen Context-luokkaan.
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;
}
}
Kutsumme tätä singletonia Activity A:sta
Manager.getInstance(this);
Muistivuodon havaitseminen Android Studion monitorien avulla
Android Studiossa on käteviä apuvälineitä, joiden avulla voit profiloida sovelluksen suorituskykyä, ja yksi niistä on Memory Monitor. Voimme käyttää Memory Monitoria muistivuotojen havaitsemiseen seuraavien vaiheiden avulla:
1. Suorita sovelluksesi mobiililaitteessa tai emulaattorissa.
2. Avaa Android Monitor (Paina Cmd + 6 Macissa tai Alt + 6 Windowsissa). Napsauta Memory Monitorin yläreunassa Start Allocation Tracking (Aloita allokaation seuranta).
3. Käytä sovellusta sen osan ympärillä, jonka epäilet kärsivän muistivuodosta. Esimerkissämme siirrymme toiseen aktiviteettiin.
4. Klikkaa Initiate GC pakottaaksesi roskienkerääjän aloittamaan sellaisten objektien keräämisen, jotka eivät ole tällä hetkellä käytössä, ja poistamaan ne. Sinun pitäisi nähdä muistin kuvaajan pienenevän hieman.
5. Napsauta Dump Java Heap (Tyhjennä Java Heap) -painiketta, jotta Android Studio voi luoda .hprof-tiedoston, joka sisältää kasan tilannekuvan. Helpoin tapa tarkistaa muistivuoto on käyttää Analyzer Tasks
6. Avaa Analyzer Tasks -välilehti ja napsauta sitten tämän välilehden yläreunasta Run. Sinun pitäisi nähdä vuotaneet toiminnot Analyzer Tasks -välilehden alapuolella olevassa Analysis Results -välilehdessä.
Muistivuodon havaitseminen Leak Canaryn avulla
Leak Canary on Squaren tekemä kirjasto ja se on erittäin nopea tapa havaita muistivuodot. Leak Canaryn avulla voit havaita muistivuodot pidemmissä ajoissa, koska sinun ei tarvitse liittää laitettasi Android Studioon ja seurata sovellustasi pitkään. Leak Canary lähettää sinulle ilmoituksia aina kun muistivuoto ilmenee.
Leak Canaryn integrointi on todella helppoa. Sinun tarvitsee vain lisätä sovellustason build.gradle-tiedostoosi seuraavat:
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’
}
Sitten lisää Application-luokkaasi seuraava koodi:
@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// Tämä prosessi on omistettu LeakCanarylle kasa-analyysiä varten.
// Sinun ei pitäisi initata sovellustasi tässä prosessissa.
return;
}
LeakCanary.install(this);
// Normaalia sovelluksen initointikoodia…
}
Ja se siitä, olet valmis.
Mahdollisten vuotojen havaitseminen Inferin avulla
Infer on Facebookin tekemä staattinen analysaattorityökalu, joka auttaa sinua löytämään mahdollisia nollaosoitinpoikkeuksia ja resurssivuotoja sekä annotaatioiden tavoitettavuutta, puuttuvia lukitussuojia ja samanaikaisuuden kilpajuoksuehtoja. Se on hyvä työkalu lisätä CI:hen kaikkien mahdollisten vikojen voittamiseksi. Se on myös avoimen lähdekoodin työkalu, joten sen kehitys kehittyy edelleen. Lisätietoa Inferistä löydät sen pika-aloitusdokumentaatiosta.