6

Domyślam istnieje oczywista odpowiedź tutaj ... ja zostaję mylić z tym jednym:17.8 Alokacja sterty MiB dla prostego projektu "Hello World"?

Dlaczego jestem 17.8 MiB pamięci sterty przydzielone gdy wszystko zrobiłem to:

  1. Utworzony prosty projekt "Hello World" z opcją Eclipse's New Project.
  2. I dodano obraz tła o wartości 56 KiB.

Jeśli wyjmę linię android:background="@drawable/background4", przydzielona pamięć spadnie do 11,9 MiB.

  • Czy to normalne, że system przydziela tak dużo pamięci? Czy powinienem się tym przejmować?
  • Co zajęłoby większą część sterty?

Ja również prowadził raport MAT na nim, ale nie jestem pewien, co wniosek wyciągnąć z niego:

góry dzięki,

+1

możesz przenieść swoje 'image' do folderu 'drawable-nodpi' i zajmie tylko' 1.5mb' pamięci –

+0

Prawda, zrobiłem to, a alokacja pamięci wynosiła 13,4 MB. Po przeszukaniu go, zgaduję, że to dlatego, że obraz nie jest skalowany przez system, prawda? Jak udało ci się wypracować 1,5 MB? – Crocodile

+1

Tak, obrazy w folderze 'drawable-nodpi' nie są skalowane przez Androida. O rozmiarze bitmapy ... masz obraz '480x800'. Każdy piksel zajmuje 4 bajty. '480 * 800 * 4 = 1536000 bajtów ~ 1,5 mb' –

Odpowiedz

4

i dodaje 56 KiB tła.

Nie, dodałeś plik 56 KiB , którego używasz jako obrazu tła.

Rzeczywistą przestrzenią sterty zużywaną przez bitmapę są trzy bajty na piksel.Z bitmapą ~ 6MB (na ekranie MAT) uruchamiasz aplikację na urządzeniu lub emulatorze o dość wysokiej rozdzielczości (1080p powinno dawać ~ 8 MB, IIRC).

+0

Dzięki temu teraz ma sens jednak zamiast tego miałeś na myśli "4 bajty na piksel"? (Tylko dlatego, że: 1080p to 1920 x 1280, a następnie 1920 x 1280 x 4 = ~ 8,3M) – Crocodile

+0

Testuję także na Samsungie Galaxy S3 (1280 x 720) i nie jestem pewien jak powinienem uzyskać ~ 6MB jako wynik. Jeszcze raz dziękuję – Crocodile

+1

@Crocodile: Prawdopodobnie masz rację - zapomniałem o kanale alfa. Jeśli chodzi o to, dlaczego otrzymujesz przydział S3 na 6MB, nie mogę powiedzieć. – CommonsWare

1

AFAIK Android zamieni obraz w układzie na bajt Array, gdy nadyma układ.

Potrzebuje obrazu tła do rozwinięcia, aby zmieścił się na ekranie, co wymaga dodatkowej pamięci ... właśnie dlatego alokuje tyle pamięci. Może nie mam racji, ale daj mi znać, jeśli się mylę.

0

OK, mógłbym się mylić pod tym numerem, ale wszystko powyżej Androida 3 będzie miało 24mb (16mb przed tym i różni się w zależności od urządzenia) limit sterty pamięci. I tak jak w każdej maszynie JVM, pamięć zostanie przydzielona prawie w całości, więc twoja aplikacja nie będzie musiała wykonywać ponownych przydziałów podczas jej cyklu życia.

To nie znaczy, że twoja aplikacja działa na poziomie 24 MB, ale ma to przydzielone, jeśli tego potrzebuje.

Wiem, że można również zwiększyć ilość pamięci sterty, której może użyć aplikacja, ale sugeruję ponowne wprowadzenie kodu w razie potrzeby.

Oczywiście wszystkie śmieci zostaną zebrane, gdy tylko zamknie się wniosek.

Aktualizacja Oto w jaki sposób można zwiększyć sterty w razie potrzeby:

android:largeHeap="true" 
+0

Jak mogę określić, ile pamięci sterty aplikacja" faktycznie działa "/ używa w tym czasie? – Crocodile

+0

Będziesz musiał profilować swoją aplikację i zobaczyć, ile pamięci rośnie. Nie mam w tej chwili IDE, ale wydaje mi się, że pamiętam wykres, który pokazuje ile pamięci zostało przydzielone i ile używasz z różnymi kolorami linii. –