The playground

More information here

minnelekkasjer I Android – identifisere, behandle og unngå

Johan Olsson Følg apr 13, 2016 · 9 min lese i vår daglige jakten på å bygge bedre apps, vi som utviklere må ta mange ting i betraktning for å holde deg på sporet, hvorav den ene Er Å Sørge for at våre apps ikke krasje. En vanlig årsak til krasjer er minnelekkasjer. Dette spesielle […]
Johan Olsson
Johan Olsson

Følg

apr 13, 2016 · 9 min lese

i vår daglige jakten på å bygge bedre apps, vi som utviklere må ta mange ting i betraktning for å holde deg på sporet, hvorav den ene Er Å Sørge for at våre apps ikke krasje. En vanlig årsak til krasjer er minnelekkasjer. Dette spesielle problemet kan manifestere seg i ulike former. I de fleste tilfeller ser vi en jevn økning i minnebruk til appen ikke kan tildele flere ressurser og uunngåelig krasjer. I Java resulterer dette ofte i At En OutOfMemoryException blir kastet. I noen sjeldne tilfeller kan lekkede klasser til og med holde seg lenge nok til å motta registrerte tilbakeringinger, noe som forårsaker noen virkelig merkelige feil og altfor ofte kaster den beryktede IllegalStateException.For å hjelpe andre med å minimere tid brukt på kodeanalyse, presenterer jeg noen eksempler på minnelekkasjer, hvordan du identifiserer Dem I Android Studio og viktigst hvordan du fjerner dem.

Ansvarsfraskrivelse

hensikten med dette innlegget og dets kodeeksempler er å fremme en dypere forståelse av minnehåndtering, spesielt I Java. Den generelle arkitekturen, styringen av tråder og håndtering av KJØRENDE HTTP-forespørsler som vises, er ikke ideell for et produksjonsmiljø og tjener bare som bærer av poenget som blir gjort: Minnelekkasjer I Android er en ting som skal vurderes.

Registrere lyttere

Dette burde egentlig ikke være et problem, men altfor ofte ser jeg samtaler til ulike registermetoder, men deres uregistrerte kolleger er ingensteds å bli sett. Dette er en potensiell kilde til lekkasjer, siden disse metodene er tydelig utformet for å bli balansert av hverandre. Uten å ringe avregistreringsmetoden, vil forekomsten trolig holde en referanse rundt lenge etter at det refererte objektet er avsluttet og vil dermed begynne å lekke minne. I Android er dette spesielt plagsomt hvis det objektet er en aktivitet, siden de ofte holder en stor mengde data. La meg vise deg hvordan det kan se ut.

I dette eksemplet lar Vi Android LocationManager informere oss om plasseringsoppdateringer. Alt vi trenger for å sette opp dette er systemtjenesten selv og en tilbakeringing for å motta oppdateringene. Her implementerer vi lokasjonsgrensesnittet i selve aktiviteten, noe som betyr At LocationManager vil holde en referanse til vår aktivitet. Nå, hvis enheten skulle roteres, ville en ny aktivitet bli opprettet og erstatte den gamle som allerede er registrert for plasseringsoppdateringer. Siden en systemtjeneste mest definitivt vil overleve enhver aktivitet, Vil LocationManager fortsatt holde en referanse til den forrige aktiviteten, noe som gjør det umulig for søppelinnsamleren å gjenvinne ressursene som fortsatt er knyttet til den aktuelle aktiviteten, noe som resulterer i at minnet blir lekket. Gjentatt rotasjon av enheten vil da føre til at ikke-gjenvinnbare aktiviteter fyller opp minnet, noe som til slutt fører til En OutOfMemoryException.

Men for å fikse en minnelekkasje må vi først kunne finne den. Heldigvis Android Studio har en innebygd verktøy kalt Android Monitor vi kan bruke til å observere minnebruk blant annet. Alt vi virkelig trenger å gjøre er å åpne Android-Skjermen og gå til Skjermer-fanen for å se hvor mye minne som brukes og tildeles i sanntid.

Android-Skjermen i Android-Studio 2.0

eventuelle interaksjoner som forårsaker ressursallokering vil bli reflektert her, noe som gjør det til et ideelt sted for å holde oversikt over programmets ressursbruk. For å finne vår minnelekkasje, må vi vite hva minnet inneholder på et tidspunkt da vi mistenker at minnet har blitt lekket. For dette eksempelet, alt vi trenger å gjøre er å starte vår søknad, rotere enheten en gang og deretter starte Dump Java Heap handling (Ved Siden Av Minne, det tredje ikonet fra venstre). Dette vil generere en hprof-fil, som inneholder et minnebilde på det tidspunktet vi påberopte handlingen. Etter et par sekunder Åpner Android Studio automatisk filen, noe som gir oss en fin visuell representasjon av minnet for enkel analyse.

jeg vil ikke gå inn i dybden om hvordan du navigerer den store minnehopen. I stedet vil jeg rette oppmerksomheten til Analysatoroppgavene øverst til høyre på skjermbildet nedenfor. Alt du trenger å gjøre for å oppdage minnelekkasjen som er introdusert i eksemplet ovenfor, er å sjekke Oppdage Lekkede Aktiviteter, og trykk deretter på spill for å få den lekkede aktiviteten til å dukke opp under Analyseresultater.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.