Platforma Android działa na założeniu, że wolna pamięć to zmarnowana pamięć. Android stara się zawsze 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 (więcej informacji o alokacji pamięci w Androidzie znajdziesz tutaj).
Proces demona LMK (low memory killer) w Androidzie monitoruje stan pamięci działającego systemu Android i reaguje na duże obciążenie pamięci, zamykając najmniej istotne procesy, aby utrzymać wydajność systemu na akceptowalnym poziomie.
Aby zdecydować, który proces zakończyć, demon LMK używa wyniku braku pamięci o nazwie oom_adj_score, aby określić priorytety uruchomionych procesów. Procesy z wysokim wynikiem są zamykane jako pierwsze. Najpierw są zamykane aplikacje działające w tle, a na końcu procesy systemowe. W tabeli poniżej podano kategorie ocen LMK od najwyższej do najniższej. Elementy z kategorii o najwyższym wyniku, w pierwszym wierszu, są usuwane jako pierwsze:
Narzędzia do profilowania pamięci
Poniższe 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ęć w czasie. Możesz wyświetlić wykres w czasie rzeczywistym, który pokazuje, ile pamięci używa Twoja aplikacja, liczbę przydzielonych obiektów Java i kiedy następuje odśmiecanie pamięci.
- Inicjuj zdarzenia odśmiecania pamięci i rób zrzuty sterty Javy podczas działania aplikacji.
- Rejestruj przydziały pamięci aplikacji, sprawdzaj wszystkie przydzielone obiekty i wyświetlaj ślad stosu dla każdego przydziału.
Jeśli Twoja gra działa na natywnym silniku, użyj HWAddress Sanitizer, aby debugować natywną alokację pamięci.
Android Studio Memory Profiler
Android Studio udostępnia Memory Profiler jako komponent Android Profiler, który pomaga wykrywać przecieki pamięci i nadmierne wykorzystanie pamięci, które mogą prowadzić do zacinania się, zawieszania, a nawet awarii aplikacji. Profiler wyświetla wykres wykorzystania pamięci przez aplikację w czasie rzeczywistym i umożliwia przechwytywanie zrzutu sterty, wymuszanie odśmiecania pamięci i śledzenie alokacji pamięci.
Narzędzia do profilowania pamięci w Unity
Jeśli do tworzenia aplikacji używasz silnika Unity, możesz skorzystać z wskazówek dotyczących profilowania pamięci w Unity. Unity udostępnia 2 narzędzia do analizowania wykorzystania pamięci w aplikacji w Unity.
Pierwszy to moduł Memory Profiler, który jest wbudowanym profilerem dostarczającym podstawowe informacje o tym, gdzie aplikacja używa pamięci.
Drugim narzędziem jest pakiet Memory Profiler, czyli pakiet Unity, który możesz dodać do swojego projektu. Pakiet dodaje do edytora Unity dodatkowe okno Memory Profiler. Memory Profiler umożliwia jeszcze dokładniejsze analizowanie wykorzystania pamięci w aplikacji. Możesz przechowywać i porównywać zrzuty, aby wykrywać wycieki pamięci lub sprawdzać układ pamięci i znajdować problemy z fragmentacją pamięci.
Unreal Memory Insights
Aplikacje utworzone za pomocą Unreal Engine mogą korzystać z narzędzia Unreal Memory Insights, aby wyświetlać szczegółowe informacje o przydzielaniu i zwalnianiu pamięci, w tym tagi LLM (Low Level Memory) i stosy wywołań powiązane z blokami pamięci.
System zapytań Memory Insights może w dowolnym momencie znajdować aktywne przydziały pamięci, wykrywać zmiany w wykorzystaniu pamięci, lokalizować wycieki pamięci i odróżniać przydziały krótkoterminowe od długoterminowych.
Od wersji UE 5.4 narzędzie Memory Insights obsługuje śledzenie pamięci ze stosami wywołań w przypadku projektów na Androida.
Statystyki dotyczące małej ilości pamięci
Android udostępnia wywołania zwrotne i interfejsy API, które umożliwiają zmniejszenie wymagań gry dotyczących pamięci i określenie, dlaczego poprzednie uruchomienia gry zostały zakończone.
Wywołania zwrotne
Nie rejestruj wywołań zwrotnych trim, które zostały wycofane. Android nie ma interfejsów API do wykrywania zdarzeń związanych z niskim poziomem pamięci natywnej, gdy system zbliża się do limitów pamięci.
Wywołania zwrotne przycinania nie pomagały w zapobieganiu zabijaniu z powodu małej ilości pamięci, więc Android wycofał wszystkie z nich z wyjątkiem TRIM_MEMORY_UI_HIDDEN i TRIM_MEMORY_BACKGROUND.
Zakończenie gry
Android próbuje wykorzystać całą dostępną pamięć do buforowania aplikacji i gier, aby zapewnić ich szybkie wczytywanie (co zwiększa komfort użytkownika). Gdy jednak pamięć jest ograniczona, system zamyka aplikacje i gry, które zużywają najwięcej pamięci, aby zwolnić ją na potrzeby normalnego działania urządzenia.
Informacje, statystyki i sprawdzone metody, które pomogą Ci lepiej zarządzać pamięcią gry:
- Użyj
ApplicationExitInfo: Ten interfejs API zwraca przyczynę, dla której poprzednia sesja gry została zakończona przez system Android. UżyjApplicationExitInfo, aby sprawdzić, czy przyczyną wcześniejszego zakończenia działania procesu była mała ilość pamięci. Sprawdź, czy gra została zamknięta z powodu braku pamięci, aby można było ją zoptymalizować pod kątem mniejszego zużycia pamięci na tym urządzeniu. - Sprawdź całkowitą pamięć RAM:
Aby zapobiec zamykaniu gier, gdy są na pierwszym planie, i dostosować się do możliwości urządzenia, sprawdź całkowitą pamięć RAM na urządzenie, aby precyzyjnie dostosować wykorzystanie pamięci przez grę. Jeśli chcesz zapobiec zamykaniu aplikacji krótko po przejściu do tła (aby umożliwić graczowi wielozadaniowość), użyj wywołań zwrotnych trim (
TRIM_MEMORY_UI_HIDDEN), aby zmniejszyć wykorzystanie pamięci przez grę.