Aplikacje, które zajmują dużo pamięci

Demon low memory killer (LMK) w Androidzie monitoruje stan pamięci działającego systemu Android i reaguje na duże obciążenie pamięci, kończąc najmniej istotne procesy. Android Vitals śledzi i raportuje w Konsoli Google Play błędy LMK widoczne dla użytkowników, aby pomóc Ci zidentyfikować problemy z obciążeniem pamięci, które wpływają na użytkowników.

Dane o błędach LMK w Android Vitals

Android Vitals może pomóc Ci monitorować i poprawiać współczynnik LMK aplikacji. Android Vitals mierzy tylko 1 częstotliwość błędów LMK: częstotliwość błędów LMK widocznych dla użytkowników.

Ten wskaźnik odzwierciedla odsetek liczby aktywnych użytkowników dziennie, u których wystąpił co najmniej 1 widoczny dla nich błąd LMK. Błąd LMK widoczny dla użytkowników to błąd związany z brakiem pamięci, który prawdopodobnie został zauważony przez użytkownika. Obejmuje to na przykład błędy występujące wtedy, gdy aplikacja wyświetla aktywność lub działa jako usługa na pierwszym planie. Zakończenie działania powoduje natychmiastowe, nieprawidłowe wyjście z procesu. Dla użytkownika końcowego wygląda to tak, jakby aplikacja uległa awarii, często z pominięciem standardowych mechanizmów zapisywania stanu cyklu życia, co powoduje utratę postępów użytkownika.

Android Vitals koncentruje się na tych zakończeniach procesów, ponieważ są one bardzo wiarygodnym wskaźnikiem problemów z niewłaściwym zarządzaniem pamięcią. Wskaźnik LMK powyżej 1% oznacza, że należy natychmiast podjąć działania. Jednak niższy współczynnik LMK nie musi oznaczać, że wykorzystanie pamięci przez aplikację jest prawidłowe. Niższy współczynnik może oznaczać, że demon LMK często kończy procesy, gdy działają w tle, co pogarsza wydajność „uruchamiania z pamięci” i płynność wielozadaniowości.

Te dane znajdziesz w sekcji Stabilność w Android Vitals:

Rysunek 1. Częstotliwość błędów LMK widocznych dla użytkowników znajdziesz w Android Vitals.

Podobnie jak w przypadku innych podstawowych wskaźników, takich jak błędy ANR i awarie, możesz filtrować dane, porównywać je z danymi innych aplikacji lub monitorować ich zmiany przez dłuższy czas (do 3 lat). Dane są dostępne w przypadku istniejących aplikacji od 28 stycznia 2025 r.

Rysunek 2. Omówienie częstotliwości błędów LMK w Android Vitals.

Jak działa demon zabijający procesy przy małej ilości pamięci

Platforma Androida działa zgodnie z założeniem, że wolna pamięć to zmarnowana pamięć. Android stara się przez cały czas wykorzystywać całą dostępną pamięć. Na przykład system przechowuje aplikacje w pamięci po ich zamknięciu, aby użytkownik mógł szybko do nich wrócić. Z tego powodu urządzenia z Androidem często działają z bardzo małą ilością wolnej pamięci (patrz Alokacja pamięci między procesami).

Aby zdecydować, który proces zakończyć, gdy zacznie brakować pamięci, demon low memory killer (LMK) używa wyniku braku pamięci o nazwie oom_adj_score, aby ustalić priorytety uruchomionych procesów. Procesy z wysokim wynikiem są kończone jako pierwsze. Aplikacje działające w tle są zamykane jako pierwsze, a procesy systemowe jako ostatnie. W tabeli poniżej podano kategorie punktacji LMK od najwyższej do najniższej. Najpierw eliminowane są elementy z kategorii o najwyższym wyniku, czyli z pierwszego rzędu:

Procesy Androida uporządkowane od najwyższego do najniższego wyniku: aplikacje działające w tle, poprzednia aplikacja, aplikacja ekranu głównego, usługi, aplikacje widoczne, aplikacja działająca na pierwszym planie, procesy trwałe, systemowe i natywne.
Rysunek 3. procesy Androida, z wysokimi wynikami u góry i niskimi u dołu.

Narzędzia do profilowania pamięci

Te narzędzia mogą pomóc w znalezieniu i zdiagnozowaniu problemów z pamięcią w następujący sposób:

  • Sprawdź, jak aplikacja przydziela pamięć na przestrzeni czasu. Możesz wyświetlić wykres w czasie rzeczywistym, który pokazuje, ile pamięci używa aplikacja, ile obiektów Javy jest przydzielonych i kiedy następuje czyszczenie pamięci.
  • Inicjowanie zdarzeń czyszczenia pamięci i tworzenie zrzutu sterty Javy podczas działania aplikacji.
  • Rejestruj alokacje pamięci aplikacji, sprawdzaj wszystkie przydzielone obiekty i wyświetlaj zrzut stosu dla każdej alokacji.

Jeśli gra działa na silniku natywnym, do debugowania alokacji pamięci natywnej użyj HWAddress Sanitizer.

Memory Profiler w Android Studio

Android Studio udostępnia Memory Profiler jako komponent Android Profiler, który pomaga identyfikować wycieki pamięci i fragmentację pamięci mogące prowadzić do zacinania się, zawieszania, a nawet awarii aplikacji. Profiler pokazuje wykres użycia pamięci przez aplikację w czasie rzeczywistym i umożliwia przechwytywanie zrzutu sterty, wymuszanie czyszczenia pamięci i śledzenie alokacji pamięci.

Narzędzie Memory Profiler w Android Studio pokazujące globalne odwołania JNI na stercie.
Rysunek 4. Wyświetlanie globalnych odwołań JNI w narzędziu Memory Profiler w Android Studio.

Narzędzia do profilowania pamięci Unity

Jeśli do tworzenia aplikacji używasz silnika Unity, możesz postępować zgodnie ze wskazówkami dotyczącymi profilowania pamięci w Unity. Unity oferuje 2 narzędzia do analizowania wykorzystania pamięci w aplikacji w Unity.

Pierwszy to moduł Memory Profiler, który jest wbudowanym profilerem dostarczającym podstawowych informacji o tym, gdzie aplikacja używa pamięci.

Moduł pamięci pokazuje alokacje pamięci, takie jak pamięć tekstur i pamięć siatki.
Rysunek 5. Okno Unity Profiler z wybranym modułem Memory (Pamięć).

Drugim narzędziem jest pakiet Memory Profiler, który jest pakietem Unity i który możesz dodać do projektu. Pakiet dodaje do edytora Unity dodatkowe okno Memory Profiler. Memory Profiler umożliwia jeszcze bardziej szczegółową analizę wykorzystania pamięci w aplikacji. Możesz przechowywać i porównywać zrzuty, aby znaleźć wycieki pamięci, lub wyświetlić układ pamięci, aby znaleźć problemy z fragmentacją pamięci.

Okno Unity Memory Profiler z podziałem zrzutu pamięci.
Rysunek 6. Analizowanie zrzutu pamięci za pomocą okna Memory Profiler.

Informacje o przepływach pracy w Unity na Androidzie znajdziesz w artykułach Sprawdzanie wykorzystania pamięci za pomocą narzędzi Unity, Optymalizowanie wykorzystania pamięci w Unity i Debugowanie błędów LMK w grach Unity.

Unreal Memory Insights

Aplikacje utworzone za pomocą Unreal Engine mogą korzystać z Unreal Memory Insights, aby wyświetlać szczegółowe informacje o alokacji i dealokacji pamięci, w tym tagi Low Level Memory (LLM) i stosy wywołań powiązane z blokami pamięci.

System zapytań Memory Insights może znaleźć aktywne alokacje w dowolnym momencie, zidentyfikować zmiany w wykorzystaniu pamięci, zlokalizować wycieki pamięci i odróżnić alokacje krótkoterminowe od długoterminowych.

Od wersji UE 5.4 narzędzie Memory Insights obsługuje śledzenie pamięci ze stosami wywołań w projektach aplikacji na Androida.

Narzędzie do śledzenia Memory Insights pokazujące wykres pamięci głównej, liczbę aktywnych alokacji i liczbę zdarzeń alokacji/zwolnienia.
Rysunek 7. Unreal Memory Insights.

Informacje o procesach Unreal na Androidzie znajdziesz w artykułach Sprawdzanie wykorzystania pamięci w Unreal i Optymalizowanie wykorzystania pamięci w Unreal.

Statystyki dotyczące małej ilości pamięci

Android udostępnia wywołania zwrotne i interfejsy API, które pozwalają zmniejszyć wykorzystanie pamięci przez grę i ustalić, dlaczego poprzednie uruchomienia gry zostały zakończone.

Wywołania zwrotne

Nie rejestruj wycofanych wywołań zwrotnych trim. Android nie udostępnia interfejsów API do wykrywania zdarzeń związanych z obciążeniem pamięci natywnej, zanim system odzyska pamięć, a szczegółowe wywołania zwrotne dotyczące przycinania pamięci (TRIM_MEMORY_RUNNING_*) nie są skuteczne w zapobieganiu zamykaniu procesów z powodu braku pamięci. W związku z tym Android wycofał wszystkie poziomy przycinania oprócz TRIM_MEMORY_UI_HIDDEN i TRIM_MEMORY_BACKGROUND. Użyj tych pozostałych wywołań zwrotnych lub ich odpowiedników w cyklu życia silnika, takich jak OnApplicationPause w Unity i ApplicationWillEnterBackgroundDelegate w Unreal, aby zwolnić interfejs i zasoby pomocnicze, gdy gra przejdzie do działania w tle. Szczegółowe informacje o implementacji znajdziesz w artykule Zmniejszanie wykorzystania pamięci w grach.

Zakończenie gry

Android próbuje wykorzystać całą dostępną pamięć do buforowania aplikacji i gier, aby zapewnić ich szybkie wczytywanie (co poprawia wrażenia użytkownika). Gdy jednak pamięć się kończy, system zamyka najbardziej pamięciożerne aplikacje i gry, aby zwolnić pamięć na potrzeby normalnego działania urządzenia.

Informacje, statystyki i sprawdzone metody, które pomogą Ci osiągnąć lepsze wykorzystanie pamięci przez grę:

  • Użyj ApplicationExitInfo: ten interfejs API zwraca przyczynę, dla której poprzednia rozgrywka została zakończona przez system Android. Użyj ApplicationExitInfo, aby sprawdzić, czy przyczyną poprzedniego zakończenia procesu było mało pamięci (REASON_LOW_MEMORY) lub zakończenie przez ogranicznik pamięci (REASON_MEMORY_LIMITER) (zobacz ApplicationExitInfo w przypadku gier). Sprawdź, czy gra została zamknięta z powodu obciążenia pamięci, aby można było ją zoptymalizować pod kątem mniejszego zużycia pamięci na danym urządzeniu.
  • Sprawdź łączną ilość fizycznej pamięci RAM: aby zapobiec zamykaniu gier, gdy są na pierwszym planie, i dostosować je do możliwości urządzenia, sprawdź łączną ilość fizycznej pamięci RAM na urządzeniu i na tej podstawie dostosuj wykorzystanie pamięci przez grę. Jeśli chcesz zapobiec zamykaniu aplikacji krótko po przejściu w tło (aby umożliwić graczowi wielozadaniowość), użyj wywołań zwrotnych trim (w szczególności TRIM_MEMORY_UI_HIDDEN), aby zmniejszyć wykorzystanie pamięci przez grę.

Dodatkowe materiały