2011-08-30 16 views
23

Pracuję nad aplikacją do przesyłania strumieniowego muzyki z Internetu ... Moja aplikacja robi wiele rzeczy i jest zorganizowana w następujący sposób: Mam widok kart i każdy widok jest przydzielany w pamięci, więc za każdym razem Przeglądam karty, aby znaleźć ponownie poprzedni status (każda zakładka może również otworzyć przeglądarkę internetową, aby znaleźć informacje o utworach, wiadomościach itp. W Internecie). Wszystko to zwiększa pamięć, ale czyni aplikację bardzo przyjazną dla użytkownika ... Po zwrocie uwagi Aby uniknąć wycieków pamięci zgodnie z przewodnikiem Androida, próbowałem spojrzeć na zajęcie sterty i odkryłem, że moja aplikacja przydziela maksymalnie 3,5 MB pamięci, a przydzielony rozmiar sterty to 4,5 - 4,6 MB ... Pracuję nad emulatorem. Nie są one tak bardzo myślę, ale czasami moja aplikacja jest restartowana, tworząc w LogCat dziwną wiadomość, taką jak:Android rosną stertę skrzyń frag

Grow heap (frag case) to 3.373 for 19764-byte allocation 

Co to jest? problem emulatora? albo coś innego? Czy używam za dużo pamięci?

Z góry dziękuję za wszelką pomoc :)

Odpowiedz

35

Maksymalna wielkość sterty zależy od urządzenia (można uzyskać tę wartość przez wywołanie Runtime.getRuntime().maxMemory()), ale jest to prawdopodobnie około 32 MB. Aby zaoszczędzić pamięć, system Android nie przydziela automatycznie maksymalnej pamięci dla każdej aplikacji. Zamiast tego czeka, aż aplikacja będzie potrzebować więcej pamięci, a następnie zapewni jej więcej miejsca na sterty, dopóki nie osiągnie maksimum. Uważam, że jest to wiadomość o numerze Grow heap.

Jeśli przydzielisz dużo pamięci i zwolnisz, możesz napotkać problemy z fragmentacją. Wikipedia ma przyzwoity opis here, ale zasadniczo oznacza, że ​​możesz mieć wymaganą dostępną pamięć, ale nie wszystko w jednym kawałku. Stąd potrzeba powiększenia sterty.

Więc, aby odpowiedzieć na twoje pytania, prawdopodobnie nie jest to problem emulatora, to tylko charakter twojego programu, który brzmi trochę za ciężko. Jednak nie jest to złe. Nie sądzę, że używanie 3-5 MB na wielu kartach z odsłonami to za dużo.

+0

o dzięki za odpowiedź^^ dlaczego to nie jest złe? Moja aplikacja wychodzi, kiedy to się dzieje ... Myślę, że to jest złe ... moja wina? Otrzymuję kolejną wiadomość: robot budowlany jest zaklinowany: 13129 ms wydane w Landroid/media/MediaPlayer; .finalize() V ... Czy wiesz, co to jest? – Erenwoid

+0

Tak, jeśli twoja aplikacja wychodzi, to jest źle. Chodzi mi o to, że użycie tylko ~ 4MB sterty dla wielu stron internetowych nie jest złe. Nie wiem zbyt wiele o kwestii 'HeapWorker'. Zwykle śledzi przydzieloną pamięć i uruchamia garbage collector na nieużywanych obiektach. Domyślam się, że jeden z twoich wątków używa całego procesora, a "MediaPlayer" nie ma czasu na uruchomienie 'finalize()', która jest funkcją, która zdecydowanie nie powinna zająć 13 sekund. –

Powiązane problemy