Sprawdzanie wykorzystania pamięci przez aplikację za pomocą narzędzia Memory Profiler

Program profilujący pamięci jest komponentem Android Profiler, który pomaga identyfikować wycieki i rezygnacje pamięci, które mogą prowadzić do zacinania się, zawiesza się, a nawet ulega awarii. Pokazuje on wykres pamięci aplikacji w czasie rzeczywistym i umożliwia przechwytywanie zrzutu stosu, wymuszanie czyszczenia pamięci i śledzenie alokacje pamięci.

Aby otworzyć program Memory Profiler, wykonaj te czynności:

  1. Kliknij Widok > Okna narzędziowe > program profilujący (możesz też kliknąć opcję Profil na pasku narzędzi).
  2. Wybierz urządzenie i proces aplikacji, które chcesz profilować na urządzeniu z Androidem. Pasek narzędzi programu profilującego. Jeśli nie widzisz urządzenia podłączonego przez USB upewnij się, że włącz debugowanie USB.
  3. Kliknij dowolne miejsce na osi czasu MEMORY, aby otworzyć program profilujący pamięci.

Możesz też sprawdzić pamięć aplikacji z poziomu wiersza poleceń, dumpsys, a także zobacz zdarzenia GC w logcat.

Dlaczego warto profilować pamięć aplikacji

Android zapewnia zarządzanego środowiska pamięci, określa, że aplikacja nie używa już niektórych obiektów, kolektor pamięci masowej zwalnia nieużywaną pamięć z powrotem do sterty. Jak Android pomaga znaleźć Niewykorzystana pamięć jest wciąż ulepszana, ale w pewnym momencie na wszystkich urządzeniach z Androidem należy na chwilę wstrzymać kod. Najczęściej są to przerwy są niedostrzegalne. Jeśli jednak aplikacja przydziela pamięć szybciej niż system aplikacja może ją pobrać, ale aplikacja może być opóźniona, dopóki kolektor uwolni wystarczająco dużo czasu aby zaspokoić swoje przydziały. Opóźnienie może spowodować pominięcie aplikacji i powodować widoczne spowolnienie.

Nawet jeśli aplikacja nie działa wolniej, w przypadku wycieku pamięci, może zachować nawet jeśli działa w tle. To zachowanie może spowolnić resztę wydajności pamięci systemu przez wymuszanie niepotrzebnego czyszczenia pamięci, zdarzeń. W końcu system musi zakończyć proces aplikacji, aby odzyskać pamięci. Gdy użytkownik wróci do aplikacji, musi ona zostać całkowicie ponownie uruchomiona.

Aby zapobiec tym problemom, użyj programu Memory Profiler, aby wykonać :

  • Poszukaj na osi czasu niepożądanych wzorców alokacji pamięci, które mogą powodują problemy z wydajnością.
  • Zrzuć stertę Javy, by sprawdzić, które obiekty zużywają w danym momencie pamięć obecnie się znajdujesz. Kilka zrzutów stosu w dłuższym okresie może pomóc wycieku pamięci.
  • Rejestruj przydziały pamięci podczas normalnej i ekstremalnej interakcji użytkownika określ dokładnie, gdzie Twój kod przypisuje zbyt wiele obiektów lub przydzielania obiektów, które mogą wyciekać.

Informacje o praktykach programowania, które mogą zmniejszyć ilość pamięci aplikacji przeczytaj artykuł Zarządzanie pamięcią aplikacji.

Omówienie narzędzia do profilowania pamięci

Po pierwszym uruchomieniu programu Memory Profiler zobaczysz wykorzystanie pamięci przez aplikację i dostęp do narzędzi, które wymuszają odśmiecanie pamięci, przechwytują stos zrzutu i rejestrowanie przydziałów pamięci.

Rysunek 1. Program profilujący pamięci

Jak wskazano na ilustracji 1, domyślny widok programu Memory Profiler zawiera: :

  1. Przycisk wymuszający zdarzenie czyszczenia pamięci.
  2. Przycisk do przechwytywania zrzutu stosu.

    Uwaga: przycisk do rejestrowania pamięci. alokacje są wyświetlane po prawej stronie przycisku zrzutu stosu tylko wtedy, połączony z urządzeniem z Androidem 7.1 (poziom interfejsu API 25) lub niższym.

  3. Menu określające częstotliwość, z jaką program profilujący ma rejestrować pamięć alokacje. Wybranie odpowiedniej opcji może pomóc poprawić wydajność aplikacji podczas profilowania.
  4. Przyciski powiększania i pomniejszania osi czasu.
  5. Przycisk do przechodzenia do bieżących danych pamięci.
  6. oś czasu zdarzeń, która zawiera stany aktywności, zdarzenia wejściowe użytkowników oraz zdarzenia obrotu ekranu.
  7. Oś czasu wykorzystania pamięci, która obejmuje te elementy:
    • skumulowany wykres wykorzystania pamięci przez poszczególne kategorie pamięci; co wskazuje oś Y po lewej stronie i klawisz koloru. na górze ekranu.
    • Linia przerywana pokazuje wskazaną liczbę przydzielonych obiektów. wzdłuż osi Y po prawej stronie.
    • Ikona każdego zdarzenia czyszczenia pamięci.

Jeśli jednak korzystasz z urządzenia z Androidem 7.1 lub starszym, dane profilowania są domyślnie widoczne. Jeśli zobaczysz komunikat „Zaawansowane” profilowanie jest niedostępne dla wybranego procesu”, musisz włącz profilowanie zaawansowane aby wyświetlić:

  • Oś czasu zdarzenia
  • Liczba przydzielonych obiektów
  • Zdarzenia dotyczące czyszczenia pamięci

W Androidzie 8.0 i nowszych profilowanie zaawansowane jest zawsze włączone z możliwością debugowania aplikacji.

Jak liczona jest pamięć

Liczby widoczne w górnej części programu Memory Profiler (ilustracja 2) są oparte na wszystkich stron pamięci prywatnej udostępnionych przez aplikację zgodnie z System Android. Ta liczba nie obejmuje stron udostępnionych systemowi ani z innymi aplikacjami.

Rysunek 2. Legenda liczenia pamięci u góry programu Memory Profiler

Kategorie w ramach liczby pamięci są następujące:

  • Java: pamięć z obiektów przydzielonych z kodu Java lub Kotlin.
  • Natywna: pamięć z obiektów przydzielonych z kodu w C lub C++.

    Nawet jeśli nie używasz języka C++ w aplikacji, możesz zobaczyć ilość pamięci natywnej ponieważ platforma Androida używa pamięci natywnej do obsługi wykonywać za Ciebie różne zadania, np. obsługiwać komponenty z obrazem grafiki, mimo że napisany przez Ciebie kod jest w języku Java lub Kotlin.

  • Grafika: pamięć używana na potrzeby kolejek buforowania grafiki, w których są wyświetlane piksele. ekranu, w tym powierzchnie GL, tekstury GL itd. (Pamiętaj, że to pamięć współdzielona z procesorem, a nie dedykowana pamięć GPU).

  • Stos: pamięć używana przez natywne stosy w Javie i stosy Java. Ten zwykle jest związana z liczbą wątków uruchomionych przez aplikację.

  • Kod: pamięć używana przez aplikację na potrzeby kodu i zasobów, np. Dex. kod bajtowy, zoptymalizowany lub skompilowany kod dex, biblioteki .so i czcionki.

  • Inne: pamięć używana przez aplikację, której system nie potrafi z łatwością pobrać. kategoryzować.

  • Przydzielono: liczba obiektów Java/Kotlin przydzielonych przez aplikację. Nie są uwzględniane obiekty przydzielone w C ani C++.

    Po połączeniu z urządzeniem z Androidem 7.1 lub starszym ten przydział licznik rozpoczyna się dopiero wtedy, gdy program Memory Profiler połączył się uruchomioną aplikację. Zatem żadne obiekty przydzielone przed rozpoczęciem profilowania nie są pod uwagę. Jednak Android 8.0 i nowszy zawiera narzędzie do profilowania, które śledzi wszystkie przydziały, dzięki czemu ta liczba zawsze jest reprezentuje łączną liczbę obiektów Java pozostających w Twojej aplikacji na Android 8.0 lub nowszy.

W porównaniu z liczbą pamięci z poprzedniego narzędzia Android Monitor Program profilujący pamięci inaczej rejestruje pamięć, więc może Ci się wydawać, że wykorzystanie pamięci jest teraz większe. Narzędzie do profilowania pamięci monitoruje dodatkowe kategorie to podnosi ich sumę, ale jeśli zależy Ci tylko na pamięci sterty Javy, kod „Java” powinna być podobna do wartości z poprzedniego narzędzia. Chociaż numer Java prawdopodobnie nie jest dokładnie taki sam jak na Androidzie Nowa liczba uwzględnia wszystkie strony pamięci fizycznej, które zostały przez stertę Javy dla aplikacji, ponieważ została ona rozwidlona z Zygote. A więc dokładnie pokazuje ilość pamięci fizycznej Twojej aplikacji których używa.

Wyświetl przydziały pamięci

Przydziały pamięci pokazują, jak obiekty Java i odwołania JNI w pliku przydzielono pamięć. Program profilujący pamięci może wyświetlić a także poniższe informacje o alokacjach obiektów:

  • Jakie typy obiektów zostały przydzielone i ile miejsca zajmują.
  • Zrzut stosu każdej alokacji, w tym w którym wątku.
  • Kiedy obiekty zostały przypisane (tylko na urządzeniu z Androidem 8.0) lub wyższą).

Aby rejestrować alokacje Java i Kotlin, wybierz Rejestruj alokacje Java / Kotlin, i kliknij Nagraj. Jeśli na urządzeniu masz Androida 8 lub nowszego, Interfejs Memory Profiler przechodzi na oddzielny ekran z bieżącym nagrywanie. Możesz sterować miniosią czasu nad nagraniem (na przykład aby zmienić zakres wyboru). Aby zakończyć nagrywanie: wybierz Zatrzymaj .

Wizualizacja alokacji Java w narzędziu Memory Profiler

W Androidzie 7.1 i starszych program profilowania pamięci używa starszej alokacji Nagrywanie, które wyświetla nagranie na osi czasu, dopóki nie klikniesz Zatrzymaj.

po wybraniu obszaru osi czasu (lub zakończeniu nagrywania). na urządzeniu z Androidem 7.1 lub starszym), lista przydzielonych są wyświetlane obiekty pogrupowane według nazwy klasy i posortowane według sterty.

Aby sprawdzić rekord alokacji:

  1. Przejrzyj listę, aby znaleźć obiekty o nietypowo dużej liczbie stertów które mogły zostać ujawnione. Aby łatwiej znaleźć znane zajęcia, kliknij nazwę zajęć. nagłówka kolumny, aby posortować alfabetycznie. Następnie kliknij nazwę zajęć. Po prawej stronie pojawi się panel Widok instancji, w którym jak widać na rysunku 3.
    • Możesz też szybko znaleźć obiekty, klikając Filtruj. , lub naciskając klawisze Control+F (Command+F na Macu) i wpisując klasę lub pakiet. nazwa w polu wyszukiwania. Możesz też wyszukiwać według nazwy metody, jeśli wybierzesz Rozmieść według liczby wywołań z menu. Jeśli chcesz użyć zwykłego wyrażenia, zaznacz pole Wyrażenie regularne. Zaznacz pole obok pozycji Uwzględniaj wielkość liter w zapytaniu, jeśli rozróżniana jest wielkość liter.
  2. W panelu Widok instancji kliknij instancję. Karta Stos wywołań poniżej z informacjami o tym, gdzie i w którym wątku przydzielono tę instancję.
  3. Na karcie Stos wywołań kliknij prawym przyciskiem dowolną linię i wybierz Przejdź do źródła, aby otworzyć kod w edytorze.

Rysunek 3. Szczegółowe informacje o każdym przydzielonych obiektach. w widoku instancji po prawej stronie

Korzystając z dwóch menu nad listą przydzielonych obiektów, możesz wybrać, które stertę danych i sposobach ich porządkowania.

W menu po lewej stronie wybierz stertę, którą chcesz sprawdzić:

  • domyślna sterta: gdy system nie określi sterty.
  • sterta obrazów: obraz rozruchowy systemu zawierający klasy, które są są wstępnie wczytywane podczas uruchamiania. Przydziały na pewno nigdy nie zostaną przeniesione lub zniknęły.
  • stertya zygote: sterta kopiowania w momencie zapisu, z którego rozgałęziony jest proces aplikacji. w systemie Android.
  • sterta aplikacji: główna sterta, na którą aplikacja przydziela pamięć.
  • Stosunek JNI: sterta, która pokazuje, gdzie interfejs natywny Java (JNI) pliki referencyjne są przydzielane i uwalniane.

W menu po prawej stronie wybierz sposób rozmieszczenia przydziałów:

  • Rozmieść według zajęć: grupuje wszystkie przydziały na podstawie nazwy zajęć. To jest domyślnej.
  • Rozmieść według pakietu: grupuje wszystkie przydziały na podstawie nazwy pakietu.
  • Rozmieść według schematu wywołań: grupuje wszystkie przydziały w odpowiednich stosu wywołań.

Popraw wydajność aplikacji podczas profilowania

Aby poprawić wydajność aplikacji podczas profilowania, narzędzie do profilowania pamięci pobierze próbki domyślnie przydzielane pamięci okresowo. Podczas testów na urządzeniach z interfejsem API na poziomie 26 lub wyższym, możesz zmienić to zachowanie korzystając z menu Śledzenie przydziałów. Dostępne opcje to następujące:

  • Pełny: przechwytuje wszystkie przydziały obiektów w pamięci. Jest to ustawienie domyślne. w Android Studio 3.2 i starszych wersjach. Jeśli masz aplikację, która alokuje wiele obiektów, można zaobserwować widoczne spowolnienia podczas profilowania.
  • Próbkowane: próbkuje przydziały obiektów w pamięci w regularnych odstępach czasu. Ten to opcja domyślna i ma mniejszy wpływ na wydajność aplikacji profilowanie. Aplikacje, które przydzielają dużo obiektów w krótkim czasie, nadal widzimy wyraźne korki.
  • Wył.: zatrzymuje śledzenie alokacji pamięci przez aplikację.
.

Wyświetl globalne odwołania do JNI

JNI (Java Native Interface) to platforma umożliwiająca korzystanie z kodu w języku Java aby zadzwonić do siebie nawzajem.

Odwołania JNI są zarządzane ręcznie przez kod natywny, więc możliwe jest, Obiekty Java używane przez kod natywny są zbyt długo utrzymywane przy życiu. Niektóre obiekty na sterta Java może stać się nieosiągalny, jeśli odwołanie JNI zostanie odrzucone bez została jawnie usunięta. Możliwe jest również wykorzystanie globalnej sieci JNI i ograniczania liczby plików referencyjnych.

Aby rozwiązać takie problemy, użyj widoku sterty JNI w usłudze Memory Profiler, aby przeglądaj wszystkie globalne odwołania JNI i filtruj je według typów Javy oraz natywnych wywołań stosy. Dzięki tym informacjom możesz sprawdzić, kiedy i gdzie globalne odwołania JNI tworzone i usuwane.

Gdy aplikacja jest uruchomiona, wybierz fragment osi czasu, który ma być w przeglądarce i w menu nad listą zajęć wybierz JNI stos. Możesz sprawdzać obiekty na stercie w zwykły sposób i kliknąć dwukrotnie obiekty na karcie Stos wywołań przydziału, aby sprawdzić, gdzie są odwołania do JNI alokowanych i udostępnionych w kodzie, jak widać na rysunku 4.

Rysunek 4. Wyświetlam globalne odwołania do JNI

Aby sprawdzić przydziały pamięci dla kodu JNI aplikacji, musisz ją wdrożyć na urządzeniu z Androidem 8.0 lub nowszym.

Więcej informacji o JNI znajdziesz we wskazówkach JNI.

Natywny program profilujący pamięci

Android Studio Memory Profiler zawiera narzędzie do profilowania pamięci natywnej dla aplikacji wdrażanych na fizycznych i wirtualnych urządzeniach z Androidem 10 lub nowszym.

Native Memory Profiler śledzi alokacje i przydzielenia obiektów w środowisku natywnym dla określonego przedziału czasu i zawiera następujące informacje:

  • Przydziały: liczba obiektów przydzielonych przez malloc() lub new operatora sieci komórkowej w wybranym okresie.
  • Deallocations: liczba obiektów objętych przydziałem free() lub Operator delete w wybranym okresie.
  • Rozmiar przydziałów: łączny rozmiar (w bajtach) wszystkich przydziałów w okresie w wybranym okresie.
  • Rozmiar w przypadku umów: łączny rozmiar (w bajtach) całej zwolnionej pamięci w wybranym okresie.
  • Łączna liczba: wartość w kolumnie Przydziały pomniejszona o wartość w kolumnę Deallocations.
  • Pozostały rozmiar: wartość w kolumnie Rozmiar przydziałów pomniejszona o w kolumnie Deallocations Size (Rozmiar w przypadku umów).

Natywny program profilujący pamięci

Aby rejestrować przydziały natywne na urządzeniach z Androidem 10 lub nowszym: wybierz Rejestruj alokacje natywne, a potem Rejestruj. Nagranie trwa do momentu kliknięcia przycisku Zatrzymaj. , po którym interfejs Memory Profiler wyświetla się na oddzielnym ekranie, do wyświetlania nagrania natywnego.

Przycisk rejestrowania alokacji natywnych

W Androidzie 9 i starszych wersjach opcja Rejestruj alokacje natywne nie jest i dostępności informacji.

Domyślnie program Native Memory Profiler używa przykładowego rozmiaru 32 bajtów: za każdym razem po przydzieleniu 32 bajtów pamięci powstaje zrzut pamięci. O mniejszy rozmiar próbki pozwala na częstsze generowanie zrzutów, dokładne dane o wykorzystaniu pamięci. Większy rozmiar próbki daje mniej dokładne wyniki danych, ale zużywa mniej zasobów systemu podczas nagrywania.

Aby zmienić rozmiar przykładowego programu do profilowania pamięci natywnej:

  1. Wybierz Uruchom > Edytuj konfiguracje.
  2. Wybierz moduł aplikacji w panelu po lewej stronie.
  3. Kliknij kartę Profiling i wpisz przykładowy rozmiar w polu Interwał próbkowania pamięci natywnej (bajty).
  4. Ponownie skompiluj i uruchom aplikację.
. .

Przechwyć zrzut stosu

Zrzut stosu pokazuje, które obiekty w aplikacji używają pamięci w danym momencie przechwytywanie zrzutu stosu. Szczególnie po rozszerzonej sesji użytkownika zrzut stosu może pomóc w identyfikacji wycieków pamięci, pokazując obiekty wciąż w pamięci, które że ich nie powinno być już tam.

Po zarejestrowaniu zrzutu stosu możesz wyświetlić te elementy:

  • Typy obiektów, które zostały przydzielone przez aplikację i ile z nich przydały się do każdego z nich.
  • Ile pamięci używa każdy obiekt.
  • Gdzie w kodzie są przechowywane odwołania do każdego obiektu.
  • Stos wywołań funkcji, do której przydzielono obiekt. (Stosy wywołań są obecnie dostępna ze zrzutem stosu tylko na Androidzie 7.1 i starszych zrzutu stosu podczas rejestrowania alokacji).

Aby zarejestrować zrzut stosu, kliknij Zarejestruj zrzut stosu i wybierz Rejestruj. Podczas usuwania stosu ilość pamięci Java może się tymczasowo zwiększyć. To normalne, ponieważ zrzut stosu odbywa się w tym samym procesie co aplikacja i wymaga trochę pamięci na ich zebranie.

Gdy narzędzie do profilowania zakończy przechwytywanie zrzutu stosu, interfejs narzędzia do profilowania pamięci przechodzi na oddzielny ekran z zrzutem stosu.

Rysunek 5. Wyświetlam zrzut stosu.

Jeśli chcesz dokładniej określić czas tworzenia zrzutu, może utworzyć zrzut stosu w krytycznym punkcie kodu aplikacji, wywołując dumpHprofData()

Na liście zajęć znajdziesz te informacje:

  • Przydziały: liczba alokacji w stercie.
  • Rozmiar natywny: łączna ilość pamięci natywnej używanej przez ten typ obiektu (w bajtach). Ta kolumna jest widoczna tylko w Androidzie 7.0 i nowszych.

    Zobaczysz tutaj pamięć dla niektórych obiektów przydzielonych w Javie, ponieważ Android korzysta z natywnej pamięci na potrzeby niektórych klas platformy, takich jak Bitmap

  • Płytki rozmiar: łączna ilość pamięci Java używana przez ten obiekt typ (w bajtach).

  • Przechowywany rozmiar: łączny rozmiar pamięci przechowywanej przez wszystkie instancje tej klasy (w bajtach).

Korzystając z dwóch menu nad listą przydzielonych obiektów, możesz wybrać, które na zrzutach stosu i w jaki sposób należy je uporządkować.

W menu po lewej stronie wybierz stertę, którą chcesz sprawdzić:

  • domyślna sterta: gdy system nie określi sterty.
  • sterta aplikacji: główna sterta, na którą aplikacja przydziela pamięć.
  • sterta obrazów: obraz rozruchowy systemu zawierający klasy, które są są wstępnie wczytywane podczas uruchamiania. Przydziały na pewno nigdy nie zostaną przeniesione lub zniknęły.
  • stertya zygote: sterta kopiowania w momencie zapisu, z którego rozgałęziony jest proces aplikacji. w systemie Android.

W menu po prawej stronie wybierz sposób rozmieszczenia przydziałów:

  • Rozmieść według zajęć: grupuje wszystkie przydziały na podstawie nazwy zajęć. To jest domyślnej.
  • Rozmieść według pakietu: grupuje wszystkie przydziały na podstawie nazwy pakietu.
  • Rozmieść według schematu wywołań: grupuje wszystkie przydziały w odpowiednich stosu wywołań. Ta opcja działa tylko wtedy, gdy zostanie zapisany zrzut stosu podczas nagrywania alokacje. Mimo to prawdopodobnie na stercie znajdują się obiekty, alokowane przed rozpoczęciem rejestrowania. Są one widoczne jako pierwsze, po prostu według nazwy zajęć.

Lista jest domyślnie sortowana według kolumny przechowywany rozmiar. Aby posortować wg w innej kolumnie, kliknij jej nagłówek.

Kliknij nazwę klasy, aby otworzyć okno Widok instancji po prawej stronie (widoczne na ilustracji 6). Każda wymieniona instancja obejmuje te elementy:

  • Grubość: najkrótsza liczba przeskoków od dowolnego rzędu GC do wybranego. instancji.
  • Rozmiar natywny: rozmiar tej instancji w pamięci natywnej. Ta kolumna jest widoczna tylko w Androidzie 7.0 i nowszych.
  • Płytki rozmiar: rozmiar tej instancji w pamięci Java.
  • Zachowywany rozmiar: rozmiar pamięci, którą dominuje ta instancja (na podstawie danych drzewa dominacji).
.

Rysunek 6. Czas wymagany do przechwycenia sterty zrzut jest wskazany na osi czasu

Aby sprawdzić stertę, wykonaj te czynności:

  1. Przejrzyj listę, aby znaleźć obiekty o nietypowo dużej liczbie stertów które mogły zostać ujawnione. Aby łatwiej znaleźć znane zajęcia, kliknij nazwę zajęć. nagłówka kolumny, aby posortować alfabetycznie. Następnie kliknij nazwę zajęć. Po prawej stronie pojawi się panel Widok instancji, w którym jak widać na rysunku 6.
    • Możesz też szybko znaleźć obiekty, klikając Filtruj. , lub naciskając klawisze Control+F (Command+F na Macu) i wpisując klasę lub pakiet. nazwa w polu wyszukiwania. Możesz też wyszukiwać według nazwy metody, jeśli wybierzesz Rozmieść według liczby wywołań z menu. Jeśli chcesz użyć zwykłego wyrażenia, zaznacz pole Wyrażenie regularne. Zaznacz pole obok pozycji Uwzględniaj wielkość liter w zapytaniu, jeśli rozróżniana jest wielkość liter.
  2. W panelu Widok instancji kliknij instancję. Źródła Karta, która zawiera wszystkie odwołania do tego obiektu.

    Możesz też kliknąć strzałkę obok nazwy instancji, aby wyświetlić wszystkie jej pola, a następnie kliknąć nazwę pola. aby wyświetlić wszystkie odwołania. Jeśli chcesz wyświetlić szczegóły instancji dla kliknij je prawym przyciskiem myszy i wybierz Przejdź do instancji.

  3. Jeśli na karcie Pliki referencyjne znajdziesz plik referencyjny, który może być w przypadku wycieku pamięci, kliknij ją prawym przyciskiem myszy i wybierz Otwórz instancję. Powoduje to zaznaczenie odpowiednią instancję ze zrzutu stosu, pokazując dane jej instancji.

W zrzucie stosu poszukaj wycieków pamięci, które mogą mieć jedną z tych przyczyn:

  • Długotrwałe odwołania do tych kategorii: Activity, Context, View, Drawable i inne obiekty, które mogą zawierać odwołanie do kontenera Activity lub Context.
  • niestatyczne klasy wewnętrzne, np. Runnable, które mogą przechowywać instancję Activity.
  • Pamięci podręczne, w których obiekty są przechowywane dłużej niż jest to konieczne.

Zapisz zrzut stosu jako plik HPROF

Po zrobieniu zrzutu stosu dane będą widoczne tylko w usłudze Memory Profiler . Po zakończeniu sesji profilowania utracisz zrzutu stosu. Jeśli więc chcesz zapisać plik do późniejszego sprawdzenia, wyeksportuj zrzut stosu do pliku HPROF. W Android Studio 3.1 i starszych wersjach opcja Eksportuj zapis do pliku Przycisk znajduje się po lewej stronie paska narzędzi, pod osią czasu. cale W Androidzie Studio 3.2 i nowszych znajduje się przycisk Eksportuj zrzut sterty po prawej stronie każdego wpisu Zrzut stosu w panelu Sesje. W menu Eksportuj jako zapisz plik z rozszerzeniem .hprof.

Aby użyć innego analizatora HPROF, takiego jak jhat, musisz przekonwertować plik HPROF z Androida na format Java SE HPROF. Możesz to zrobić za pomocą narzędzia hprof-conv dostępnego w android_sdk/platform-tools/. Uruchom: hprof-conv polecenie z 2 argumentami: pierwotnym plikiem HPROF i lokalizacją do zapisania . Na przykład:

hprof-conv heap-original.hprof heap-converted.hprof

Importowanie pliku zrzutu stosu

Aby zaimportować plik HPROF (.hprof), kliknij Rozpocznij nową sesję profilowania w: Okienko Sesje, kliknij Wczytaj z pliku i wybierz plik z pliku przeglądarki.

Plik HPROF możesz też zaimportować, przeciągając go z przeglądarki plików do okno edytora.

Wykrywanie przecieków w usłudze Memory Profiler

Podczas analizowania zrzutu stosu w narzędziu Memory Profiler możesz filtrować profilowanie dane, które według Android Studio mogą wskazywać wycieki pamięci w aplikacjach Activity i Wystąpienia w Twojej aplikacji: Fragment.

Typy danych wyświetlanych przez filtr obejmują:

  • Activity instancja, która została zniszczona, ale nadal się odwołuje.
  • Fragment instancji, które nie mają prawidłowego pola FragmentManager, ale są nadal do którego się odwołujemy.

W pewnych sytuacjach, takich jak ta, filtr może zwrócić wartość „fałsz” pozytywne:

  • Element Fragment został utworzony, ale nie jest jeszcze używany.
  • Element Fragment jest przechowywany w pamięci podręcznej, ale nie wchodzi w skład elementu FragmentTransaction.

Aby korzystać z tej funkcji, najpierw przechwyć zrzut stosu lub zaimportuj plik zrzutu stosu do Android Studio. Aby wyświetlić fragmenty i działania, które mogą powoduje wyciek pamięci, zaznacz na stercie pole wyboru Activity/Fragments (Wycieki danych) zrzutu panelu narzędzia Memory Profiler, jak pokazano na rysunku 7.

Program profilujący: wykrywanie wycieku pamięci

Rysunek 7. Filtruję zrzut stosu pod kątem wycieków pamięci.

Techniki profilowania pamięci

Podczas korzystania z narzędzia Memory Profiler należy podkreślić kod aplikacji i spróbować wymuszać wycieku pamięci. Jednym ze sposobów na wywołanie wycieku pamięci w aplikacji jest uruchomienie jej przez jeszcze przed sprawdzeniem stosu. Wycieki mogą docierać na samą górę na stercie. Jednak im mniejszy wyciek, tym dłużej trzeba należy uruchomić aplikację, aby go wyświetlić.

Wyciek pamięci możesz też wywołać na jeden z tych sposobów:

  • Obróć urządzenie kilka razy z pionowej na poziomą i z powrotem stanów aktywności. Obrócenie urządzenia może często spowodować wyciek z aplikacji Activity, Context lub View obiekt, ponieważ system odtwarza Activity, a jeśli Twoje zawiera odwołanie do jednego z tych obiektów w innym miejscu, system nie może go wyczyścić.
  • Przełączaj się między aplikacją i inną aplikacją w różnych stanach aktywności (przejdź do ekranu głównego, a następnie wróć do aplikacji).

Wskazówka: powyższe czynności możesz też wykonać, korzystając z test monkeyrunner platformy.