2012-11-06 6 views
14

Czy ktoś może dać mi szczegółowe wyjaśnienie dotyczące profilu uzyskanego przez adb shell dumpsys meminfo my-app-name?Szczegółowe wyjaśnienie profilu z "adb shell dumpsys meminfo my-app-name"?

Rezultat jest tak samo, jak to wspomniano poniżej w How do I discover memory usage of my application in Android?:

** MEMINFO in pid 890 [process-name] ** 
        native dalvik other total 
      size: 10940  7047  N/A 17987 
     allocated:  8943  5516  N/A 14459 
      free:  336  1531  N/A  1867 
      (Pss):  4585  9282 11916 25783 
    (shared dirty):  2184  3596  916  6696 
    (priv dirty):  4504  5956  7456 17916 

Objects 
      Views:  149  ViewRoots:  4 
    AppContexts:  13  Activities:  0 
      Assets:  4 AssetManagers:  4 
    Local Binders:  141 Proxy Binders:  158 
Death Recipients:  49 
OpenSSL Sockets:  0 

SQL 
      heap:  205   dbFiles:  0 
     numPagers:  0 inactivePageKB:  0 
    activePageKB:  0 

Co oznacza każda kolumna (native, Dalvik, inne, łącznie) oznacza? szczególnie co to jest "inna" kolumna (nie wiem, co to jest poza rdzennym i dalvik)? Byłoby wspaniale, gdyby ktoś mógł podać konkretny przykład, aby to rozwinąć. np. Mam aplikację A. A ma własny obiekt obj_private i własną bibliotekę macierzystą lib_private. Poza tym A odwołuje się do jakiegoś obiektu platformy Android obj_shared i do jakiejś natywnej biblioteki lib_shared. I obj_shared odwołuje się do natywnej biblioteki Androida lib_shared_indirect. W takim przypadku, czy mogę to powiedzieć?

  1. "całkowita wielkość" równa się zawartości pamięci użytkownik "obj_private + lib_private + obj_shared + lib_shared + lib_shared_indirect".
  2. „prywatne brudny” równa pamięć zanieczyszczona przez „obj_private + lib_private”

Powodem chcemy jasno o to: istnieją pewne niezwykły wzrost runtime-pamięć o naszej najnowszej wersji aplikacji w porównaniu do poprzedniej wersja. I kiedy użyłem meminfo dumpsys, zauważyłem, że kolumny "rodzime" i "inne" dramatycznie wzrosły. Ale zmiana nowej wersji jest związana tylko z Javą i nie ma wyjaśnienia na temat "innej" kolumny. Przeszukałem go i nie znalazłem żadnego dokumentu. Próbowałem również odczytać kod źródłowy adb. Ale odkryłem, że łatwo jest zgubić się w kodzie źródłowym dla początkujących, takich jak ja. Dlatego zamieszczam to pytanie na wypadek, gdyby ktoś mógł pomóc.

+0

Proszę sprawdzić http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android –

Odpowiedz

10

Mamy teraz więcej dokumentacji obejmującej wykorzystanie pamięci RAM w systemie Android, która zawiera szczegółowe informacje na temat różnych numerów pamięci RAM: Managing Your App's Memory. W szczególności przyjrzyj się środkowi strony omawiającej kluczowe części dumpu meminfo: Investigating Your RAM Usage.

Wygląda na to, że dane wyjściowe meminfo pochodzą z dość starej wersji Androida, zanim mogliśmy zidentyfikować wiele różnych typów przydziałów. Aby zmapować to, co widzisz, do aktualnej dokumentacji, po prostu uważaj "inne" za wszystko, co pokazuje współczesny zrzut, poza sekcjami native i dalvik. W twoim wysypisku wierzę, że twoja sekcja dalvik to w rzeczywistości nowoczesne "Dalvik Heap" i "Dalvik Other" razem wzięte.

Jeśli chodzi o sekcje rodzimych i inne coraz bardziej po tylko zmiana kodu Java, tak to z pewnością może się zdarzyć. Wiele części interfejsu API Java systemu Android znajduje się w górnej części macierzystych przydziałów i może również powodować inne alokacje. Klasycznym tego przykładem będą bitmapy na Gingerbread i wcześniejszych, gdzie dane dla bitmapy były natywną alokacją, a nie alokacją tablic w stosie Java, jak jest dzisiaj.

Twoje zwiększone inne przydziały mogą być spowodowane wieloma rzeczami, jak zobaczysz w nowszych wersjach danych - kursory wspierające pamięć, współużytkowane obszary pamięci z asmenu, urządzenia przypisujące takie rzeczy, jak grafika tekstur itp. Jest tak wiele rzeczy, że trudno powiedzieć, co może się dziać, dlatego obecnie sprawozdanie jest bardziej szczegółowe. (I nawet tam nadal mamy wiele rzeczy, które zapadają w nieznane).

Do debugowania tego, prawdopodobnie chcesz spojrzeć na stos Java dla wycieków obiektów. Ponieważ faktyczna alokacja obiektu nie znajduje się w stercie Java, może to być oczywiście trudne.Proponuję zrobienie zrzutu sterty na początku twojej aplikacji, rób cokolwiek robisz, co spowoduje zwiększenie rozmiaru pamięci RAM, po czym zrób zrzut sterty i sprawdź, jakie liczby obiektów wzrosły. Wskazana dokumentacja pokazuje, w jaki sposób porównywać zrzuty sterty z MAT.

Także, gdy patrzysz na swoją stertę Javy, tak samo jak ogólną analizę (z wyjątkiem sytuacji, gdy robisz różnice), zawsze postępuj zgodnie z instrukcjami tam, aby zedrzeć część zygoty sterty. Jak wspomniano w dokumentacji, każdy proces ma dużą liczbę przydziałów od zygoty, ale są one wspólne dla wszystkich procesów, więc nie są ogólnie istotne dla analizy sterty. Bardzo często widzę osoby zainteresowane, ponieważ widzą dużo bardzo dużych bitmap w swojej aplikacji, które wydaje się, że system je przydzielił, i uważają, że jest to najważniejsza rzecz przy korzystaniu z pamięci RAM w ich aplikacji, kiedy nie jest, to tylko współdzielone przydziały z zygoty.

Powiązane problemy