The playground

More information here

minnesläckor i Android – identifiera, behandla och undvika

Johan Olsson följ Apr 13, 2016 · 9 min läs i vår dagliga strävan att bygga bättre appar måste vi som utvecklare ta många saker i beaktande för att hålla oss på rätt spår, varav en är att se till att våra appar inte kraschar. En vanlig orsak till krascher är minnesläckor. Detta speciella problem […]
Johan Olsson
Johan Olsson

följ
Apr 13, 2016 · 9 min läs

i vår dagliga strävan att bygga bättre appar måste vi som utvecklare ta många saker i beaktande för att hålla oss på rätt spår, varav en är att se till att våra appar inte kraschar. En vanlig orsak till krascher är minnesläckor. Detta speciella problem kan manifestera sig i olika former. I de flesta fall ser vi en stadig ökning av minnesanvändningen tills appen inte kan allokera fler resurser och oundvikligen kraschar. I Java resulterar detta ofta i att en OutOfMemoryException kastas. I vissa sällsynta fall kan läckta klasser till och med hålla sig kvar tillräckligt länge för att få registrerade återuppringningar, vilket orsakar några riktigt konstiga buggar och alltför ofta kastar den ökända IllegalStateException.

för att hjälpa andra att minimera tiden som spenderas på kodanalys presenterar jag några exempel på minnesläckor, hur man identifierar dem i Android Studio och viktigast av allt hur man tar bort dem.

ansvarsfriskrivning

syftet med detta inlägg och dess kodexempel är att främja en djupare förståelse för minneshantering, särskilt i Java. Den allmänna arkitekturen, hanteringen av trådar och hanteringen av att köra HTTP-förfrågningar som visas är inte idealiska för en produktionsmiljö och fungerar bara som bärare av den punkt som görs: minnesläckor i Android är en sak att överväga.

registrera lyssnare

detta borde inte vara ett problem men alltför ofta ser jag samtal till olika registermetoder men deras oregistrerade motsvarigheter är ingenstans att se. Detta är en potentiell källa till läckage, eftersom dessa metoder är tydligt utformade för att balanseras av varandra. Utan att anropa avregistreringsmetoden kommer förekomsten förmodligen att hålla en referens runt långt efter att det refererade objektet har avslutats och kommer därmed att börja läcka minne. I Android är detta särskilt besvärligt om det objektet är en aktivitet, eftersom de ofta innehåller en stor mängd data. Låt mig visa dig hur det kan se ut.

i det här exemplet låter Vi Android LocationManager informera oss om platsuppdateringar. Allt vi behöver för att ställa in detta är själva systemtjänsten och en återuppringning för att ta emot uppdateringarna. Här implementerar vi platsgränssnittet i själva aktiviteten, vilket innebär att LocationManager kommer att ha en hänvisning till vår aktivitet. Om enheten skulle roteras skulle en ny aktivitet skapas som ersätter den gamla som redan är registrerad för platsuppdateringar. Eftersom en systemtjänst definitivt kommer att överleva någon aktivitet, kommer LocationManager fortfarande att ha en hänvisning till den tidigare aktiviteten, vilket gör det omöjligt för sophämtaren att återta de resurser som fortfarande är knutna till den specifika aktiviteten, vilket resulterar i att minnet läcker ut. Upprepad rotation av enheten kommer då att orsaka icke-återvinningsbara aktiviteter för att fylla i minnet, vilket i slutändan leder till en OutOfMemoryException.

men för att fixa en minnesläcka måste vi först kunna hitta den. Lyckligtvis har Android Studio ett inbyggt verktyg som heter Android Monitor vi kan använda för att observera minnesanvändning bland annat. Allt vi verkligen behöver göra är att öppna Android-monitorn och gå till fliken bildskärmar för att se hur mycket minne som används och tilldelas i realtid.

Android Studio 2.0

alla interaktioner som orsakar resursallokering kommer att återspeglas här, vilket gör det till en idealisk plats för att hålla reda på programmets resursanvändning. För att hitta vår minnesläcka måste vi veta vad minnet innehåller vid en tidpunkt då vi misstänker att minnet har läckt ut. För det här exemplet behöver vi bara starta vår applikation, rotera enheten en gång och sedan åberopa Dump Java Heap-åtgärden (bredvid minnet, den tredje ikonen från vänster). Detta kommer att generera en hprof-fil, som innehåller en minnesbild när vi åberopade åtgärden. Efter några sekunder öppnar Android Studio automatiskt filen, vilket ger oss en snygg visuell representation av minnet för enkel analys.

Jag kommer inte att gå in i djupet om hur man navigerar i den enorma minneshögen. Istället riktar jag din uppmärksamhet mot Analysatoruppgifterna i det övre högra hörnet av skärmdumpen nedan. Allt du behöver göra för att upptäcka minnesläckan som introduceras i exemplet ovan är att kontrollera upptäcka läckta aktiviteter och tryck sedan på play för att få den läckta aktiviteten att dyka upp under analysresultat.

Lämna ett svar

Din e-postadress kommer inte publiceras.