Wykorzystanie pamięci przez bitmapę

Bitmapy są często największymi obiektami w aplikacji, które zużywają pamięć. Operacje dekodowania i skalowania często znajdują się na ścieżce krytycznej renderowania klatek. Optymalizacja wykorzystania pamięci bitmapy znacznie poprawia szybkość reakcji interfejsu, żywotność baterii i ogólną stabilność, ponieważ zmniejsza liczbę zacięć, błędów ANR i zakończeń procesów związanych z błędem OOM.

Identyfikowanie wysokiego wykorzystania pamięci bitmapy

Android Vitals udostępnia dane o wykorzystaniu pamięci bitmapy przez aplikację, agregując dane z urządzeń z Androidem. Te dane są domyślnie obliczane jako 28-dniowe podsumowanie danych dziennych. Te dane pomagają identyfikować trendy i potencjalne regresje w zakresie wydajności pamięci na różnych typach i wersjach urządzeń.

Android Vitals udostępnia dane o wykorzystaniu pamięci bitmapy przez aplikację z podziałem na te stany procesu:

  • Pierwszy plan: proces aplikacji jest widoczny. Wartość P99 powinna być znacznie wyższa w przypadku procesów działających na pierwszym planie niż w przypadku innych stanów procesów, ale deweloperzy powinni sprawdzić, czy stosunek P99 do P50 jest znaczący (np. wyższy niż 3,5x), ponieważ często wskazuje to na wyciek pamięci bitmapy. Możesz to sprawdzić, szukając rozbieżności między typowym wykorzystaniem (P50) a wykorzystaniem odstającym (P99). Ogólne nadmierne wykorzystanie zasobów powoduje równomierne zwiększenie pamięci we wszystkich centylach, natomiast wycieki pamięci narastają z czasem, co powoduje duże odchylenie danych na końcu zakresu (P99). Sprawdź, czy przydzielanie bitmap na pierwszym planie nie utrzymuje się niepotrzebnie po przejściu aplikacji do innych stanów.
  • Usługi widoczne dla użytkowników: proces aplikacji jest uruchomiony w stanie zauważalnym. Obejmuje to usługi na pierwszym planie, przyspieszone zadania i zadania przesyłania danych inicjowane przez użytkownika. Aplikacje nie mogą zachowywać dużych przydziałów bitmapy na pierwszym planie podczas przechodzenia do tych stanów. Ponieważ te usługi są przeznaczone do długotrwałych zadań, przechowywanie dużych zasobów pogarsza ogólną wygodę użytkowników i zmusza demona LMKD (Low Memory Killer Daemon) do odzyskiwania pamięci przez zamykanie procesów o niższym priorytecie.
  • Tło: aplikacja uruchamia usługę w tle lub została niedawno przeniesiona w tło, ale nie jest jeszcze w pamięci podręcznej. Ten stan procesu jest mniej ważny niż procesy na pierwszym planie lub widoczne, dlatego aplikacje powinny w tym miejscu jawnie zwalniać duże zasoby bitmapowe, aby zmniejszyć obciążenie pamięci.
  • W pamięci podręcznej: aplikacja jest w stanie pamięci podręcznej. Ten stan jest bardzo wrażliwy na wykorzystanie pamięci systemowej, np. na LMK. Aplikacje muszą aktywnie ograniczać wykorzystanie pamięci bitmapy w tym stanie, aby uniknąć usunięcia przez system operacyjny.

Czynniki wpływające na wysokie wykorzystanie pamięci bitmapy

W obliczeniach może być też uwzględniona pamięć wirtualna, która nigdy nie była używana. Jeśli widzisz nieoczekiwanie wysokie wykorzystanie pamięci bitmapy, sprawdź, czy nie przydzielasz pamięci, która nie jest używana.