Wykorzystanie pamięci (anonimowy RSS + przestrzeń wymiany)

Wykorzystanie pamięci (anonimowy RSS + przestrzeń wymiany) to wskaźnik w Android Vitals, który odzwierciedla wykorzystanie pamięci przez Twoją aplikację.

Anonimowa pamięć to pamięć, która nie jest obsługiwana przez plik w pamięci masowej, np. alokacje sterty i pamięć przydzielona za pomocą mmap. Obejmuje ona dynamiczne alokacje pamięci w aplikacji, w tym stertę Java lub Kotlin, niezarządzane alokacje sterty natywnej (gdzie dane pikseli Bitmap znajdują się w Androidzie 8.0 (API na poziomie 26) i nowszych) oraz stosy wykonywania wątków. System operacyjny może zwolnić pamięć obsługiwaną przez plik, ale nie może zwolnić pamięci anonimowej.

Rozmiar zestawu rezydentnego (RSS) to łączna liczba stron pamięci (współdzielonych i niewspółdzielonych) używanych przez proces, które są przechowywane w fizycznej pamięci RAM. Strona jest uznawana za „współdzieloną”, jeśli jest do niej dostęp z więcej niż 1 procesu (np. aplikacji, które korzystają z tej samej biblioteki).

W przypadku pamięci anonimowej system może zapisywać strony w przestrzeni wymiany (lub zRAM w Androidzie) gdy pamięć jest obciążona. W razie potrzeby system może odczytać te strony z przestrzeni wymiany.

Łącznie wykorzystanie pamięci (anonimowy RSS + przestrzeń wymiany) to miara łącznej liczby stron pamięci aplikacji, które nie są obsługiwane przez plik w pamięci masowej, w tym pamięci, która jest też zachowywana przez system w przestrzeni wymiany. Śledzenie anonimowego RSS + przestrzeni wymiany pozwala zobaczyć rzeczywiste, nieusuwalne wykorzystanie pamięci aplikacji.

Jeśli wykorzystanie pamięci przez aplikację jest wysokie, zbadaj problem i rozwiąż go, korzystając z informacji na tej stronie.

Określanie wysokiego wykorzystania pamięci

Android Vitals

Android Vitals udostępnia informacje o wykorzystaniu pamięci przez aplikację podzielone według tych stanów procesu:

  • Pierwszy plan: proces aplikacji jest widoczny. Wysoka wartość P99 w tym przypadku często wpływa na wydajność odczuwaną przez użytkownika (przycięcia lub awarie z powodu braku pamięci) i jest w dużej mierze spowodowana zachowywaniem niepotrzebnych już komponentów interfejsu lub aktywności.
  • Usługi odczuwalne przez użytkownika: proces aplikacji działa w stanie odczuwalnym. Obejmuje to usługi na pierwszym planie, zadania przyspieszone i dane inicjowane przez użytkownika transferu. Może też obejmować usługi powiązane z systemem lub usługi powiązane z innymi aplikacjami. Ponieważ te usługi są przeznaczone do długotrwałych zadań, utrzymywanie pamięci z powodu wycieków lub niezwalniania zasobów może z czasem zwiększyć wartość P99.
  • Tło: aplikacja uruchamia usługę w tle lub niedawno została przeniesiona w tło , ale nie jest jeszcze w pamięci podręcznej. W tym przypadku mogą się kumulować wycieki przetwarzania w tle i niezwalniane zasoby. Ponieważ ten stan procesu jest mniej ważny niż procesy na pierwszym planie lub odczuwalne, staraj się unikać zachowywania dużych ilości pamięci w tym stanie.
  • W pamięci podręcznej: aplikacja jest w stanie w pamięci podręcznej. Ten stan jest bardzo wrażliwy na obciążenie pamięci systemowej, np. na LMK. Ponieważ system operacyjny może w dowolnym momencie usunąć ten stan procesu, jest on udostępniany tylko do celów debugowania.

Aby dowiedzieć się, jak te stany procesu korelują z wywołaniami zwrotnymi onTrimMemory, zapoznaj się z informacjami o zwalnianiu pamięci w odpowiedzi na zdarzenia.

Android Vitals dzieli też wykorzystanie pamięci przez aplikację według zasobników pamięci RAM. Wskaźnik wykorzystania pamięci jest wyświetlany jako oś czasu dziennych wartości procentowych wraz z najnowszą dzienną wartością dla 50. i 90. percentyla.

Gdy określisz poziom odniesienia wykorzystania pamięci, postępuj zgodnie z instrukcjami, aby zdiagnozować i poprawić nadmierne wykorzystanie pamięci.

Określanie wycieków pamięci za pomocą odchylenia ogona

Aby pomóc w identyfikowaniu wycieków pamięci, poszukaj w Android Vitals rozbieżności między typowymi (P50) a końcowymi (P90) użytkownikami. Ogólne zwiększenie rozmiaru zasobów powoduje równomierne zwiększenie wykorzystania pamięci we wszystkich percentylach, ale wycieki pamięci kumulują się z czasem, co powoduje duże odchylenie danych końcowych.

Porównaj wskaźniki P90 i P99 z poziomem odniesienia P50 według nazwy procesu. Jeśli stosunek P90 do P50 przekracza 3,5, oznacza to prawdopodobny wyciek pamięci podczas dłuższych sesji. W niektórych przypadkach podwyższony współczynnik nie zawsze wskazuje na wyciek, ale należy ocenić konkretny przepływ pracy, aby sprawdzić, czy podwyższone wykorzystanie pamięci jest oczekiwanym zachowaniem.

Zasoby

Lokalne diagnozowanie nadmiernego wykorzystania pamięci

Aby rozpocząć diagnozowanie źródła nadmiernego wykorzystania pamięci, możesz przechwycić zrzut sterty za pomocą opcji Zarejestruj zrzut sterty w ustawieniach dewelopera, Android Studio lub Perfetto. Zalecamy rozpoczęcie od przechwycenia zrzutu sterty lokalnie po przetestowaniu podstawowych ścieżek użytkownika w aplikacji.

Szczególnie zalecamy przetestowanie tych ścieżek użytkownika:

  • Komponenty WebView i sesje przeglądarki w aplikacji
  • Przewijanie nieskończone z dużą ilością multimediów
  • Procesy tworzenia i edytowania komponentów

Aby zbadać potencjalne wycieki pamięci, najpierw określ procesy, które zużywają najwięcej zasobów, korzystając z tabeli Nazwa procesu w panelu Android Vitals dotyczącym wykorzystania pamięci. Następnie uruchom odpowiednie ścieżki użytkownika lokalnie i zbierz zrzuty sterty w różnych stanach procesu (widoczny, usługa na pierwszym planie i w pamięci podręcznej), aby sprawdzić, czy aplikacja zwalnia pamięć po przeniesieniu w tło.

Jeśli debugujesz problemy z pamięcią za pomocą profilera Android Studio, możesz też użyć integracji z LeakCanary, aby usprawnić wykrywanie wycieków i duplikatów bitmap oraz zoptymalizować wykorzystanie obrazów.

Po zebraniu zrzutu sterty zalecamy użycie umiejętności AI Perfetto do analizy zrzutu sterty i określenia potencjalnych źródeł wysokiego wykorzystania pamięci.

Oto przykład odpowiedzi, jaką mogą udzielić umiejętności AI:

I have completed the analysis of memory leaks and bitmap issues for [app] using the provided Perfetto trace.
  Summary of Findings
  The investigation identified a critical memory pressure issue caused by massive bitmap retention within the app process.
...
Recommendations for [app]
   1. [Library] Image Cache Optimization:
       * Review the [Library] caching strategy. Ensure that bitmaps
         loaded for animations are released or downsampled when the animation is
         not in the foreground.
   2. Asset Resolution Audit:
       * The 14.7 MB average size suggests full-screen or extremely high-density assets. Audit the [library] files in the native_home component to ensure they are not using unnecessarily large source images.
   3. View Lifecycle Management:
       * Investigate why 21 [LibraryImage] instances are alive simultaneously. Ensure that views in the bottom
      tab are properly detached or their animations are cleared when switching between tabs.
   4. Fix Surface Leaks:
       * Address the Surface.release failures observed in the logs, as these can lead to both memory leaks and
         native resource exhaustion.

Dodatkowe materiały dotyczące interpretowania zrzutów sterty

Więcej informacji o interpretowaniu zrzutów sterty i debugowaniu wykorzystania pamięci znajdziesz w tych materiałach:

  • Analiza ręczna: zapoznaj się z informacjami o eksploratorze zrzutów sterty Perfetto, aby dowiedzieć się, jak poruszać się po wizualizacjach zrzutów sterty w interfejsie Perfetto i jak je interpretować.
  • Alokacje Java/Kotlin: przeczytaj artykuł Wizualizowanie pierwszego zrzutu sterty ART, aby zapoznać się ze szczegółowym przewodnikiem po analizowaniu zrzutów sterty środowiska wykonawczego Androida (ART).
  • Alokacje natywne: zapoznaj się z dokumentacją profilowania natywnego Perfetto, aby dowiedzieć się, jak zbierać i analizować profile pamięci natywnej (C/C++).
  • Sprawdzanie w wierszu poleceń: użyj polecenia adb dumpsys meminfo, aby szybko sprawdzić wykorzystanie pamięci przez aplikację na urządzeniu.
  • Analiza wspomagana przez AI: użyj umiejętności AI Perfetto, aby przeprowadzić analizę opartą na LLM, która pomoże wykryć wycieki pamięci i nadmierne alokacje w śladach.
  • Analiza oparta na SQL: użyj umiejętności Perfetto SQL i analizy śladów, aby uruchamiać uporządkowane zapytania i specjalistyczne skrypty do analizowania złożonych danych śladów.

Poprawianie wykorzystania pamięci

Więcej informacji o poprawianiu wykorzystania pamięci przez aplikację znajdziesz w tych sekcjach:

Szczegółowe informacje o rozwiązywaniu problemów z pamięcią znajdziesz w przewodniku Zarządzanie pamięcią aplikacji.