Użyłem / proc / meminfo i przeanalizowałem odpowiedź na polecenie, jednak wynik pokazuje, że:
MemTotal: 94348 kB MemFree: 5784 kB
znaczy. pokazuje, że jest tylko 5 MB wolnej pamięci. Czy to możliwe z Androidem Mobile? Na moim telefonie jest zainstalowana tylko 5-6 aplikacji i żadne inne zadanie nie jest uruchomione. ale nadal to polecenie pokazuje, że jest bardzo mało wolnej pamięci.
Czy ktoś może to wyjaśnić? czy jest jakiś inny sposób uzyskania wykorzystania pamięci w systemie Android?
android
memory-management
Badal
źródło
źródło
Debug.getNativeHeapFreeSize()
.Odpowiedzi:
OSTRZEŻENIE: Ta odpowiedź mierzy użycie pamięci / dostępną dla URZĄDZENIA. To NIE jest to, co jest dostępne w Twojej aplikacji. Aby zmierzyć, co robi Twoja aplikacja i jest DOZWOLONE, użyj odpowiedzi programisty Androida .
Dokumentacja systemu Android - ActivityManager.MemoryInfo
parse / proc / meminfo polecenie. Kod referencyjny można znaleźć tutaj: Uzyskaj użycie pamięci w systemie Android
użyj poniższego kodu i uzyskaj aktualną pamięć RAM:
Wyjaśnienie liczby 0x100000L
Jest dość oczywiste, że liczba jest używana do konwersji z bajtów na mebibajty
PS: musimy obliczyć całkowitą pamięć tylko raz. więc wywołaj punkt 1 tylko raz w swoim kodzie, a następnie możesz wywołać kod punktu 2 wielokrotnie.
źródło
Zależy to od definicji zapytania pamięci, które chcesz uzyskać.
Zwykle chcesz poznać stan pamięci sterty, ponieważ jeśli zużywa ona zbyt dużo pamięci, pojawia się OOM i powoduje awarię aplikacji.
W tym celu możesz sprawdzić kolejne wartości:
Im bardziej zmienna „usedMemInMB” zbliża się do wartości „maxHeapSizeInMB”, tym bliżej
availHeapSizeInMB
zera, tym bliżej jest OOM. (Z powodu fragmentacji pamięci możesz dostać OOM, ZANIM to osiągnie zero.)To również pokazuje narzędzie DDMS do wykorzystania pamięci.
Alternatywnie, istnieje rzeczywiste użycie pamięci RAM, czyli ile zużywa cały system - zobacz zaakceptowaną odpowiedź, aby to obliczyć.
Aktualizacja: ponieważ Android O sprawia, że twoja aplikacja korzysta również z natywnej pamięci RAM (przynajmniej do przechowywania map bitowych, co jest zwykle głównym powodem dużego zużycia pamięci), a nie tylko sterty, rzeczy się zmieniły i otrzymujesz mniej OOM (ponieważ heap nie zawiera już bitmap, sprawdź tutaj ), ale nadal powinieneś mieć oko na użycie pamięci, jeśli podejrzewasz, że masz wycieki pamięci. W systemie Android O, jeśli masz wycieki pamięci, które powinny spowodować OOM w starszych wersjach, wygląda na to, że po prostu ulegnie awarii bez możliwości złapania go. Oto jak sprawdzić użycie pamięci:
Ale uważam, że najlepiej byłoby użyć profilera IDE, który pokazuje dane w czasie rzeczywistym za pomocą wykresu.
Dobra wiadomość na Androidzie O jest taka, że znacznie trudniej jest uzyskać awarie z powodu OOM przechowywania zbyt wielu dużych bitmap, ale zła wiadomość jest taka, że nie sądzę, aby można było złapać taki przypadek w czasie wykonywania.
EDYCJA: wydaje się
Debug.getNativeHeapSize()
zmieniać w czasie, ponieważ pokazuje całkowitą maksymalną ilość pamięci dla Twojej aplikacji. Dlatego te funkcje są używane tylko przez program profilujący, aby pokazać, ile używa Twoja aplikacja.Jeśli chcesz uzyskać rzeczywistą całkowitą i dostępną natywną pamięć RAM, użyj tego:
źródło
Oto sposób obliczenia wykorzystania pamięci aktualnie uruchomionej aplikacji :
źródło
Runtime.freeMemory()
zwraca 0 iRuntime.totalMemory()
zwraca tylko aktualnie przydzieloną pamięć.Inny sposób (obecnie pokazuję 25 MB wolnego miejsca na moim G1):
źródło
Filozofia zarządzania pamięcią w Linuksie to „Wolna pamięć to zmarnowana pamięć”.
Zakładam, że następne dwa wiersze pokażą, ile pamięci jest w "Buforach", a ile w "Buforach". Chociaż istnieje różnica między tymi dwoma (proszę nie pytać, jaka to różnica :), oba z grubsza sumują się do ilości pamięci używanej do buforowania danych plików i metadanych.
O wiele bardziej użytecznym przewodnikiem po zwolnieniu pamięci w systemie Linux jest
free(1)
polecenie; na moim komputerze zgłasza takie informacje:+/- buffers / cache: line to magiczna linia, która informuje, że naprawdę mam około 589 megabajtów aktywnie potrzebnej pamięci procesowej i około 5391 megabajtów `` wolnej '' pamięci, w tym sensie, że 91 + 374 megabajtów buforów / pamięci podręcznej można wyrzucić, gdyby można było z niej skorzystać w innym miejscu.
(Moja maszyna działała przez około trzy godziny, prawie nic poza przepełnieniem stosu, dlatego mam tak dużo wolnej pamięci).
Jeśli system Android nie jest dostarczany z programem
free(1)
, możesz samodzielnie obliczyć/proc/meminfo
plik; Po prostu podoba mi sięfree(1)
format wyjściowy. :)źródło
cat /proc/meminfo
zamiast tego będziesz chciał . Jest o wiele bardziej szczegółowy, aleMemFree
.Buffers
, iCached
są prawdopodobnie najważniejszymi wersami.Odsyłam do kilku prac.
odniesienie:
Ta metoda getMemorySize () jest zwracana MemorySize, która ma całkowity i wolny rozmiar pamięci.
Nie wierzę doskonale w ten kod.
Ten kod testuje na LG G3 cat.6 (v5.0.1)
Wiem, że Pattern.compile () jest kosztowny, więc możesz przenieść jego kod do elementu klasy.
źródło
Spojrzałem na drzewo źródłowe Androida.
Wewnątrz com.android.server.am. ActivityManagerService.java (usługa wewnętrzna udostępniana przez android.app. ActivityManager ).
Wewnątrz android.os. Process.java
Wywołuje metodę JNI z android_util_Process.cpp
Wniosek
MemoryInfo.availMem = MemFree + Cached w / proc / meminfo.
Uwagi
Całkowita pamięć jest dodawana na poziomie API 16.
źródło
Możesz także użyć narzędzia DDMS, które jest częścią pakietu Android SDK. pomaga w uzyskaniu alokacji pamięci kodu java i natywnego kodu c / c ++, jak również.
źródło
źródło
To dziwny kod. Zwraca MaxMemory - (totalMemory - freeMemory). Jeśli freeMemory jest równe 0, to kod zwróci MaxMemory - totalMemory, więc może być większe lub równe 0. Dlaczego freeMemory nie jest używane?
źródło
Oto inny sposób sprawdzenia wykorzystania pamięci w aplikacji:
Przykładowe dane wyjściowe:
Ogólne wykorzystanie pamięci:
https://developer.android.com/studio/command-line/dumpsys#meminfo
źródło