Java - cum să aflu folosirea memoriei aplicației mele în memoria android, cod q - un rus (ru)

Rețineți că utilizarea memoriei în sistemele de operare moderne, cum ar fi Linux, este o zonă extrem de complexă și greu de înțeles. De fapt, șansele de a interpreta cu adevărat toate cifrele pe care le primiți sunt extrem de scăzute. (Aproape de fiecare dată când mă uit la numerele de utilizare a memoriei cu alți ingineri, există întotdeauna o discuție lungă despre ceea ce înseamnă cu adevărat, ceea ce duce doar la concluzii vagi.)

Notă. Acum avem o documentație mult mai cuprinzătoare pentru gestionarea memoriei aplicației dvs., care acoperă cea mai mare parte a materialelor de aici și este mai modernă cu starea Android.

Mai întâi, probabil citiți ultima parte a acestui articol, care discută modul în care este gestionată memoria pe Android:

La un nivel inferior, puteți utiliza API-ul Debug pentru a obține informațiile inițiale despre nivelul de memorie la nivel de kernel: android.os.Debug.MemoryInfo

Rețineți că de la versiunea 2.0 există un API, ActivityManager.getProcessMemoryInfo. pentru a obține aceste informații despre un alt proces: ActivityManager.getProcessMemoryInfo (int [])

Aceasta returnează o structură MemoryInfo la nivel inferior cu toate aceste date:

Dar în ceea ce privește diferența dintre Pss. PrivateDirty și SharedDirty. Ei bine, acum începe distracția.

Cea mai mare parte a memoriei din sistemele Android (și sistemele Linux ca întreg) este de fapt împărțită între mai multe procese. Deci, cât de multă memorie folosită de proces este de fapt neclară. Adăugați peste această paginare pe disc (să nu mai vorbim de bursă, pe care nu o folosim pe Android), și acest lucru este și mai puțin clar.

Astfel, dacă ar fi să ia toate fizice RAM, de fapt afișate pentru fiecare proces, și adăugați toate procesele, probabil că vei primi în cele din urmă cifrele sunt mult mai mari decât cantitatea reală de RAM.

Numărul Pss este măsura pe care kernelul o calculează, care ține cont de partajarea memoriei - în esență, fiecare pagină a RAM din proces este scalată de raportul dintre numărul de alte procese care utilizează și această pagină. Deci, puteți să adăugați pss la toate procesele pentru a vedea totalul RAM pe care îl folosesc și pentru a compara pss între procese pentru a obține o idee aproximativă despre greutatea lor relativă.

O altă metrică interesantă este PrivateDirty. care este în esență cantitatea de RAM în proces care nu poate fi descărcată pe disc (nu este susținută de aceleași date de pe disc) și nu este utilizată cu alte procese. O altă modalitate de a privi acest lucru este memoria RAM, care va deveni disponibilă sistemului atunci când acest proces va dispărea (și, probabil, se va transforma rapid în cache-uri și alte aplicații).

Pentru a face acest lucru, este API-ul SDK. Cu toate acestea, puteți face acest lucru ca dezvoltator utilizând dispozitivul.

Dacă doriți doar să vă uitați la utilizarea memoriei în toate procesele, puteți folosi comanda adb shell procrank. Rezultatul acestui lucru în același sistem este următorul:

Pss. după cum am văzut înainte și Uss Priv Dirty.

Este interesant de observat aici: Pss și Uss ușor (sau ceva mai mult) diferă de ceea ce am văzut în meminfo. De ce este asta? Prokrank folosește un mecanism diferit de kernel pentru a colecta datele sale decât meminfo. și oferă rezultate ușor diferite. De ce este asta? Sincer, nu am idee. Cred că procrank-ul poate fi mai precis. dar, de fapt, trebuie doar să lași punctul: "Luați orice informație despre memoria pe care o primiți cu sare, adesea o grămadă foarte mare".

În sfârșit, există o comandă adb shell / proc / meminfo care oferă o scurtă descriere a utilizării totale a memoriei în sistem. Există o mulțime de date, doar primele câteva numere, care este de a vorbi (și restul dintre ele sunt clare pentru mai multe persoane, iar întrebările mele cu privire la aceste puțini oameni despre ele duc adesea la explicații contradictorii):

MemTotal - este cantitatea totală de memorie disponibilă pentru kernel-ul și spațiul utilizator (de multe ori mai mică decât dispozitivul real de memorie fizică, deoarece o parte din memorie necesare pentru radio, bufferele DMA, etc. D ..).

MemFree este cantitatea de memorie RAM care nu este folosită deloc. Camera pe care o vedeți aici este foarte mare; De regulă, în sistemul Android aceasta va fi doar câteva MB, deoarece încercăm să folosim memoria disponibilă pentru a sprijini procesele

Cache este memoria RAM folosită pentru cache-urile de sistem de fișiere și alte lucruri similare. Pentru sistemele tipice, este nevoie de aproximativ 20 MB pentru a evita intrarea în stări de paginare proaste; Sacrificarea Android ucigaș nu a fost configurat pentru un anumit sistem, pentru a se asigura că procesele de fond sunt ucise înainte de memorie din cache se consumă prea mult din ele să conducă la o astfel de paginare.

Da, puteți obține informații despre memorie programat și decideți dacă să faceți o muncă intensă cu memoria.

Obțineți mărimea mulțimii VM apelând:

Obțineți memoria VM alocată apelând:

Obțineți o limită a dimensiunii de heap VM apelând:

Obțineți memoria internă alocată apelând:

Am făcut o cerere pentru a afla comportamentul lui OutOfMemoryError și pentru a monitoriza utilizarea memoriei.

Aceasta este o lucrare în desfășurare, dar nu o înțeleg:

De ce nu este PID corelat cu rezultatul în activityManager.getProcessMemoryInfo ()? Evident, doriți ca datele rezultate rezultate să fie semnificative, de ce Google a făcut atât de dificilă corelarea rezultatelor? Sistemul actual nu funcționează chiar dacă vreau să procesez toate utilizările de memorie, deoarece rezultatul returnat este o serie de obiecte android.os.Debug.MemoryInfo, dar niciunul dintre aceste obiecte nu vă spune cu adevărat ce pisici sunt asociate cu acestea. Dacă treceți doar o serie de piduri, nu puteți înțelege rezultatele. În măsura în care înțeleg, această utilizare face lipsită de sens transferul a mai mult de un singur pid la un moment dat, și apoi, dacă da, de ce ActivityManager.getProcessMemoryInfo () acceptă doar un int matrice?

Hackbod-ul este unul dintre cele mai bune răspunsuri la stivuire. El aruncă o lumină asupra unui subiect foarte obscur. Acest lucru ma ajutat foarte mult.

Statisticile procesului, serviciul, pentru a afla modul în care aplicația gestionează memoria, este explicată într-un post de pe blog. Statistica procesului: înțelegerea modului în care aplicația dvs. utilizează memoria RAM de la Dianne Hackborn:

1) Presupun că nu, cel puțin nu din Java.
2)

Android Studio 0.8.10+ a introdus un instrument incredibil de util numit Monitor de memorie.

Ce este bun pentru:

  • Afișează memoria disponibilă și utilizată în evenimente grafice și de colectare a gunoiului de-a lungul timpului.
  • Testarea rapidă pentru aplicarea lentă poate fi asociată cu evenimente excesive de colectare a gunoiului.
  • Testarea rapidă a erorilor aplicațiilor se poate datora lipsei de memorie.

Figura 1. Forțarea evenimentului GC (colecția de gunoi) de pe monitorul de memorie Android

Folosind acest lucru, puteți obține o mulțime de informații utile despre consumul în timp real al RAM-ului aplicației.

Articole similare