Mam opracowaną aplikację na Androida i jestem na etapie rozwoju aplikacji na telefon, w którym wszystko wydaje się działać dobrze, a Ty chcesz ogłosić zwycięstwo i statek, ale wiesz, że muszą być tylko wycieki pamięci i zasobów tam; a na Androidzie jest tylko 16 MB sterty, a jej pozornie zaskakująco łatwe do wycieku w aplikacji na Androida.
Rozejrzałem się i do tej pory udało mi się tylko znaleźć informacje o „hprof” i „traceview”, ale żadne z nich nie ma wielu pochlebnych recenzji.
Jakie narzędzia lub metody znalazłeś lub opracowałeś i chciałbyś udostępnić w projekcie systemu operacyjnego?
android
memory-leaks
jottos
źródło
źródło
Odpowiedzi:
Jednym z najczęstszych błędów, które znalazłem podczas tworzenia aplikacji na Androida, jest błąd „java.lang.OutOfMemoryError: rozmiar mapy bitowej przekracza budżet maszyny wirtualnej”. Znalazłem ten błąd często w działaniach wykorzystujących wiele bitmap po zmianie orientacji: działanie jest niszczone, tworzone ponownie, a układy są „zawyżane” z pliku XML zużywającego pamięć maszyny wirtualnej dostępną dla map bitowych.
Mapy bitowe w poprzednim układzie działania nie są odpowiednio zwalniane przez moduł odśmiecania pamięci, ponieważ krzyżowały się z nimi odniesienia do ich działania. Po wielu eksperymentach znalazłem całkiem dobre rozwiązanie tego problemu.
Najpierw ustaw atrybut „id” w widoku nadrzędnym układu XML:
Następnie, w metodzie onDestroy () Twojego Activity, wywołaj metodę unbindDrawables () przekazującą referencję do nadrzędnego widoku, a następnie wykonaj System.gc ()
Ta metoda unbindDrawables () bada drzewo widoku rekurencyjnie i:
źródło
PageAdapter
i ten błąd mniePobierz narzędzie Eclipse Memory Analyzer ( http://www.eclipse.org/mat/ ) Sprawdź http://kohlerm.blogspot.com/2010/02/android-memory-usage-analysis-slides.html i http: // kohlerm.blogspot.com/search/label/memory
źródło
Głównie dla podróżników Google z przyszłości:
Większość narzędzi java niestety nie nadaje się do tego zadania, ponieważ analizują one tylko stertę JVM. Każda aplikacja na Androida ma jednak również natywną stertę, która również musi mieścić się w limicie ~ 16 MB. Zwykle jest używany na przykład do danych bitmapowych. Możesz więc dość łatwo natknąć się na błędy braku pamięci, nawet jeśli twoja sterta JVM jest chillin około 3 MB, jeśli używasz wielu elementów do rysowania.
źródło
Odpowiedź z @ hp.android działa dobrze, jeśli pracujesz tylko z tłem bitmapowym, ale w moim przypadku miałem
BaseAdapter
zestawImageView
s dla aGridView
. ZmodyfikowałemunbindDrawables()
metodę zgodnie z zaleceniami, aby warunek był następujący:ale problem polega na tym, że metoda rekurencyjna nigdy nie przetwarza elementów potomnych
AdapterView
. Aby rozwiązać ten problem, zamiast tego wykonałem następujące czynności:tak, że elementy podrzędne
AdapterView
są nadal przetwarzane - metoda po prostu nie próbuje usunąć wszystkich elementów podrzędnych (co nie jest obsługiwane).Nie rozwiązuje to jednak problemu, ponieważ
ImageView
s zarządzają bitmapą, która nie jest ich tłem. Dlatego dodałem, co następuje. Nie jest idealny, ale działa:Ogólnie
unbindDrawables()
metoda jest następująca:Mam nadzieję, że istnieje bardziej zasadnicze podejście do uwolnienia takich zasobów.
źródło
Dobra rozmowa Google I / O (2011) na temat zarządzania pamięcią w systemie Android, a także szczegóły dotyczące narzędzi + technik profilowania pamięci:
http://www.youtube.com/watch?v=_CruQY55HOk
źródło
Valgrind został przeniesiony na Androida (sponsorowany przez Mozillę). Zobacz Valgrind na Androidzie - aktualny stan i wsparcie Uruchomienie Valgrind dla Androida na ARM (komentarz 67).
źródło
Cóż, to są narzędzia, które łączą się z unikalnymi formatami używanymi przez Androida. Myślę, że to, z czego możesz być niezadowolony, to podstawowa struktura kodu testowego w użyciu.
Czy próbowałeś próbować testować obszary kodu przy użyciu Android Mock Framework?
źródło