The playground

More information here

scurgeri de memorie în Android – identifica, trata și pentru a evita

Johan Olsson urmați Apr 13, 2016 · 9 min citit în urmărirea noastră de zi cu zi de a construi aplicații mai bune, noi, ca dezvoltatorii trebuie să ia multe lucruri în considerare pentru a rămâne pe drumul cel bun, dintre care unul este de a vă asigura că aplicațiile noastre nu accident. O cauză […]
Johan Olsson
Johan Olsson

urmați
Apr 13, 2016 · 9 min citit

în urmărirea noastră de zi cu zi de a construi aplicații mai bune, noi, ca dezvoltatorii trebuie să ia multe lucruri în considerare pentru a rămâne pe drumul cel bun, dintre care unul este de a vă asigura că aplicațiile noastre nu accident. O cauză comună a accidentelor sunt scurgerile de memorie. Această problemă particulară se poate manifesta sub diferite forme. În majoritatea cazurilor, vedem o creștere constantă a utilizării memoriei până când aplicația nu poate aloca mai multe resurse și se blochează inevitabil. În Java Acest lucru duce adesea la o outofmemoryexception fiind aruncat. În unele cazuri rare, clasele scurse pot chiar să rămână suficient de mult timp pentru a primi apeluri înregistrate, provocând unele bug-uri cu adevărat ciudate și, de prea multe ori, aruncă notorietatea IllegalStateException.

pentru a-i ajuta pe ceilalți să minimizeze timpul petrecut în analiza codului, vă voi prezenta câteva exemple de scurgeri de memorie, cum să le identificați în Android Studio și, cel mai important, cum să le eliminați.

Disclaimer

scopul acestui post și exemplele sale de cod este de a promova o înțelegere mai profundă a managementului memoriei, în special în Java. Arhitectura generală, gestionarea firelor și gestionarea cererilor HTTP care rulează afișate nu sunt ideale pentru un mediu de producție și servesc doar ca purtător al punctului realizat: scurgerile de memorie în Android sunt un lucru care trebuie luat în considerare.

înregistrarea ascultătorilor

Acest lucru nu ar trebui să fie într-adevăr o problemă, dar de prea multe ori văd apeluri la diferite metode de înregistrare, dar omologii lor unregister nu sunt nicăieri de văzut. Aceasta este o sursă potențială de scurgeri, deoarece aceste metode sunt clar concepute pentru a fi echilibrate între ele. Fără a apela metoda unregister, instanța va păstra, probabil, o referință în jurul mult timp după obiectul de referință a fost încheiată și va începe astfel scurgeri de memorie. În Android, Acest lucru este deosebit de supărător dacă acel obiect este o activitate, deoarece acestea dețin adesea o cantitate mare de date. Lasă-mă să-ți arăt cum ar putea arăta.

în acest exemplu, lăsăm LocationManager Android să ne informeze despre actualizările locației. Tot ce avem nevoie pentru a configura acest lucru este serviciul de sistem în sine și un apel invers pentru a primi actualizările. Aici implementăm interfața de locație în activitatea în sine, ceea ce înseamnă că LocationManager va deține o referință la activitatea noastră. Acum, dacă dispozitivul ar fi rotit, ar fi creată o nouă activitate înlocuind-o pe cea veche deja înregistrată pentru actualizări de locație. Deoarece un serviciu de sistem va supraviețui cu siguranță oricărei activități, LocationManager va deține în continuare o referință la activitatea anterioară, ceea ce face imposibil pentru colectorul de gunoi să recupereze resursele încă legate de acea activitate particulară, rezultând Scurgerea memoriei. Rotirea repetată a dispozitivului va determina apoi activități nerecuperabile pentru a umple memoria, ducând în cele din urmă la o excepție OutOfMemory.

dar pentru a remedia o scurgere de memorie, trebuie mai întâi să o putem găsi. Din fericire, Android Studio are un instrument încorporat numit Android Monitor pe care îl putem folosi pentru a observa utilizarea memoriei, printre altele. Tot ce trebuie să facem este să deschidem monitorul Android și să mergem la fila monitoare pentru a vedea câtă memorie este utilizată și alocată în timp real.

monitorul Android în Android Studio 2.0

orice interacțiuni care cauzează alocarea resurselor vor fi reflectate aici, făcându-l un loc ideal pentru urmărirea utilizării resurselor aplicației dvs. Pentru a găsi Scurgerea memoriei noastre, trebuie să știm ce conține memoria într-un moment în care bănuim că memoria a fost scursă. Pentru acest exemplu particular, tot ce trebuie să facem este să pornim aplicația noastră, să rotim dispozitivul o dată și apoi să invocăm acțiunea Dump Java Heap (lângă memorie, a treia pictogramă din stânga). Aceasta va genera un fișier hprof, care conține un instantaneu de memorie în momentul în care am invocat acțiunea. După câteva secunde, Android Studio deschide automat fișierul, oferindu-ne o reprezentare vizuală îngrijită a memoriei pentru o analiză ușoară.

Nu voi intra în profunzime despre cum să navighez în imensul heap de memorie. În schimb, vă voi direcționa atenția către sarcinile analizorului din colțul din dreapta sus al capturii de ecran de mai jos. Tot ce trebuie să faceți pentru a detecta scurgerea de memorie introdusă în exemplul de mai sus este să verificați detectarea activităților scurse și apoi apăsați Redare pentru ca activitatea scursă să apară sub rezultatele analizei.

Lasă un răspuns

Adresa ta de email nu va fi publicată.