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:
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.
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:
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ę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.
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.
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.
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żyjApplicationExitInfo, 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
- Zarządzanie pamięcią w grach
- Jak monitorować wykorzystanie pamięci w grach
- Jak zmniejszyć wykorzystanie pamięci w grach
- Omówienie zarządzania pamięcią