The playground

More information here

wycieki pamięci w Androidzie – identyfikuj, lecz i unikaj

Johan Olsson Follow Apr 13, 2016 · 9 min czytaj w naszym codziennym dążeniu do budowania lepszych aplikacji, jako programiści musimy wziąć pod uwagę wiele rzeczy, aby pozostać na dobrej drodze, jedną z nich jest upewnienie się, że nasze aplikacje nie ulegają awarii. Częstą przyczyną awarii są wycieki pamięci. Ten szczególny problem może przejawiać się […]
Johan Olsson
Johan Olsson

Follow

Apr 13, 2016 · 9 min czytaj

w naszym codziennym dążeniu do budowania lepszych aplikacji, jako programiści musimy wziąć pod uwagę wiele rzeczy, aby pozostać na dobrej drodze, jedną z nich jest upewnienie się, że nasze aplikacje nie ulegają awarii. Częstą przyczyną awarii są wycieki pamięci. Ten szczególny problem może przejawiać się w różnych formach. W większości przypadków obserwujemy stały wzrost zużycia pamięci, dopóki aplikacja nie będzie w stanie przydzielić więcej zasobów i nieuchronnie ulegnie awarii. W Javie często powoduje to wyrzucenie Outofmoryexception. W niektórych rzadkich przypadkach wyciekające klasy mogą nawet pozostać na tyle długo, aby otrzymać zarejestrowane wywołania zwrotne, powodując naprawdę dziwne błędy i zbyt często rzucając notorycznie Nielegalstateexception.

aby pomóc innym zminimalizować czas spędzony na analizie kodu, przedstawię kilka przykładów wycieków pamięci, jak je zidentyfikować w Android Studio i co najważniejsze, jak je usunąć.

Disclaimer

celem tego postu i jego przykładów kodu jest promowanie głębszego zrozumienia zarządzania pamięcią, szczególnie w Javie. Ogólna Architektura, zarządzanie wątkami i obsługa uruchomionych żądań HTTP nie są idealne dla środowiska produkcyjnego i służą jedynie jako nośnik punktu: wycieki pamięci w Androidzie są rzeczą, którą należy wziąć pod uwagę.

Rejestracja słuchaczy

to nie powinno być problemem, ale zbyt często widzę wywołania do różnych metod rejestracji, ale ich niezarejestrowanych odpowiedników nigdzie nie widać. Jest to potencjalne źródło wycieków, Ponieważ Metody te są wyraźnie zaprojektowane tak, aby były wzajemnie zrównoważone. Bez wywołania metody unregister, instancja prawdopodobnie będzie przechowywać referencję długo po zakończeniu odwoływania się do obiektu i tym samym zacznie wyciekać pamięć. W Androidzie jest to szczególnie kłopotliwe, jeśli ten obiekt jest aktywnością, ponieważ często przechowują dużą ilość danych. Pokażę Ci, jak to może wyglądać.

w tym przykładzie pozwalamy menedżerowi lokalizacji Androida informować nas o aktualizacjach lokalizacji. Wszystko, czego potrzebujemy, aby to skonfigurować, to sama usługa systemowa i wywołanie zwrotne, aby otrzymywać aktualizacje. Tutaj implementujemy interfejs lokalizacji w samej aktywności, co oznacza, że LocationManager będzie zawierał odniesienie do naszej aktywności. Teraz, jeśli urządzenie miało zostać obrócone, zostanie utworzona nowa aktywność zastępująca starą już zarejestrowaną dla aktualizacji lokalizacji. Ponieważ usługa systemowa zdecydowanie przetrwa każdą aktywność, LocationManager nadal będzie zawierał odniesienie do poprzedniej aktywności, co uniemożliwia garbage collector odzyskanie zasobów nadal związanych z tą konkretną aktywnością, powodując wyciek pamięci. Powtarzające się obracanie urządzenia spowoduje, że czynności, których nie można odzyskać, wypełnią pamięć, co ostatecznie doprowadzi do wystąpienia wrażenia z pamięci.

ale aby naprawić wyciek pamięci, najpierw musimy być w stanie go znaleźć. Na szczęście Android Studio ma wbudowane narzędzie o nazwie Android Monitor, za pomocą którego możemy obserwować zużycie pamięci między innymi. Wszystko, co naprawdę musimy zrobić, to otworzyć Monitor Androida i przejść do karty Monitory, aby zobaczyć, ile pamięci jest używane i przydzielane w czasie rzeczywistym.

Monitor Androida w Androidzie Studio 2.0

wszelkie interakcje powodujące alokację zasobów będą tutaj odzwierciedlone, dzięki czemu jest to idealne miejsce do śledzenia wykorzystania zasobów Twojej aplikacji. Aby znaleźć wyciek pamięci, musimy wiedzieć, co pamięć zawiera w momencie, gdy podejrzewamy, że pamięć wyciekła. W tym konkretnym przykładzie wystarczy uruchomić naszą aplikację, raz obrócić urządzenie, a następnie wywołać akcję Dump Java Heap (obok pamięci, trzecia ikona od lewej). Spowoduje to wygenerowanie pliku hprof, który zawiera migawkę pamięci w momencie wywołania akcji. Po kilku sekundach Android Studio automatycznie otwiera plik, dając nam schludną wizualną reprezentację pamięci w celu łatwej analizy.

Nie będę zagłębiał się w to, jak poruszać się po ogromnej stercie pamięci. Zamiast tego skieruję twoją uwagę na zadania analizatora w prawym górnym rogu poniższego zrzutu ekranu. Wszystko, co musisz zrobić, aby wykryć wyciek pamięci wprowadzony w powyższym przykładzie, to sprawdzić wykrycie wycieku aktywności, a następnie nacisnąć przycisk play, aby wyciekła aktywność pojawiła się w wynikach analizy.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.