Spędziłem 4 pełne dni próbując wszystkiego, co w mojej mocy, aby znaleźć wyciek pamięci w aplikacji, którą tworzę, ale wszystko przestało mieć sens dawno temu.
Aplikacja, którą tworzę, ma charakter społecznościowy, więc pomyśl o profilu Działania (P) i wymień działania z danymi - na przykład odznaki (B). Możesz przeskoczyć z profilu do listy odznak do innych profili, do innych list itp.
Wyobraź sobie więc przepływ taki jak ten P1 -> B1 -> P2 -> B2 -> P3 -> B3, itd. Dla spójności ładuję profile i identyfikatory tego samego użytkownika, więc każda strona P jest taka sama i tak jest każdej stronie B.
Ogólna istota problemu jest taka: po dłuższej nawigacji, w zależności od rozmiaru każdej strony, otrzymuję wyjątek braku pamięci w losowych miejscach - mapy bitowe, ciągi znaków itp. - wydaje się, że nie jest spójny.
Po zrobieniu wszystkiego, co tylko można sobie wyobrazić, aby dowiedzieć się, dlaczego brakuje mi pamięci, nic nie znalazłem. Nie rozumiem, dlaczego Android nie zabija P1, B1 itd., Jeśli zabraknie pamięci po załadowaniu i zamiast tego ulega awarii. Spodziewałbym się, że te wcześniejsze działania umrą i zostaną wskrzeszone, jeśli kiedykolwiek wrócę do nich za pośrednictwem onCreate () i onRestoreInstanceState ().
Nie mówiąc już o tym - nawet jeśli zrobię P1 -> B1 -> Back -> B1 -> Back -> B1, nadal mam awarię. Wskazuje to na jakiś wyciek pamięci, ale nawet po zrzuceniu hprof i użyciu MAT i JProfiler nie mogę tego zlokalizować.
Wyłączyłem ładowanie obrazów z sieci (i zwiększyłem ładowane dane testowe, aby to zrekompensować i uczynić test sprawiedliwym) i upewniłem się, że pamięć podręczna obrazów używa SoftReferences. Android faktycznie próbuje zwolnić kilka SoftReferences, które ma, ale tuż przed wypadnięciem z pamięci.
Strony znaczków pobierają dane z sieci, ładują je do tablicy EntityData z BaseAdapter i przesyłają do ListView (w rzeczywistości używam doskonałego MergeAdapter firmy CommonsWare , ale w tym działaniu związanym z odznaką jest tak naprawdę tylko 1 adapter, ale ja tak czy inaczej chciałem o tym wspomnieć).
Przeszukałem kod i nie udało mi się znaleźć niczego, co mogłoby przeciekać. Wyczyściłem i anulowałem wszystko, co mogłem znaleźć, a nawet System.gc () z lewej i prawej strony, ale aplikacja nadal się zawiesza.
Nadal nie rozumiem, dlaczego nieaktywne działania, które znajdują się na stosie, nie są zbierane i naprawdę chciałbym to rozgryźć.
W tym miejscu szukam wszelkich wskazówek, porad, rozwiązań ... wszystkiego, co mogłoby pomóc.
Dziękuję Ci.
outOfMemory
błąd. Dzięki!