Android Rozumienie rozmiarów sterty

Jestem całkiem nowy w rozwoju Androida i nie mogę zrozumieć wyjątku Java Out of Memory. Wiem, że to oznacza, że ​​moja aplikacja przeszła budżet VM, ale po tym, jak googluję, wciąż nie rozumiem tej koncepcji. Obawiam się, że moja aplikacja zużywa zbyt dużo pamięci, ponieważ mam sześć selektorów przycisków na ekran z dwoma bitmapami dla każdego selektora, które mają po około 20 kb, zgodnie z zakładką właściwości. Na moim rootowanym G2x ustawiłem budżet maszyny wirtualnej na 12 MB, uruchomiłem ponownie telefon i uruchomiłem aplikację bez żadnych problemów. Odłączam drawables na każdym onDestroy () i sugeruję, że GC również tutaj uruchomi. Po użyciu aplikacji przez pewien czas w emulatorze klikam „Cause GC” na moim ekranie DDMS, a wyniki to ID = 1, Heap Size 6.133 MB, Allocated 2.895MB, Free 3.238 MB,% Used 47.20, # Objects 52 623.

Tutaj nie rozumiem, co się dzieje, mój emulator jest ustawiony na 24 MB maszyny wirtualnej. Gdzie jest ten numer? Rzeczywisty problem, jaki mam, polega na tym, że jeśli ustawię emulator na 16 MB maszyny wirtualnej, moja aplikacja zawiesza się przy drugim działaniu z wyjątkiem wyjątku pamięci. Jak to się stało, że w moim telefonie nie ma awarii VM ustawionej na 12 MB lub w moim starym telefonie HTC Magic z 12 MB zasobów VM? Czy myślicie, że moja aplikacja zajmuje zbyt dużo pamięci? Nie mam pojęcia, czy te numery DDMS są dobre, czy nie. Dziękuję za Twój czas.

Jeśli chodzi o mój kod, to mam każdy obraz określony w układach XML. Nie robię z nimi nic programowo, z wyjątkiem dodawania do nich słuchaczy. Znalazłem ten fragment kodu tutaj i dodałem go do każdej aktywności, którą mam ...

@Override
protected void onDestroy() {
    super.onDestroy();

    unbindDrawables(findViewById(R.id.myRootLayout));
    System.gc();
}

private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
    }
    if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
        ((ViewGroup) view).removeAllViews();
    }
}

W przeciwnym razie wszystko, co robię, to dodanie do ClickListeners przycisków, które mają tła PNG. Chciałbym nauczyć się programowo określać tła przycisków, ale muszę mieć funkcje selektora, takie jak ustawianie ostrości, naciskanie, nieostre, ale naciskanie itp., Aby tła przycisków zmieniały się w zależności od interakcji użytkownika. Przejrzałem dokumenty na ten temat, ale wydaje się to przytłaczające, dlatego pomyślałem, że zacznę tutaj od podstaw zarządzania Heapami i zacznę określać selektory w kodzie. Może to nie mieć sensu, ale czy istnieje „zdrowa” ilość alokacji pamięci, którą aplikacja mogłaby przydzielić bez zbliżania się do wyjątku „Brak pamięci”? Na przykład, jeśli aplikacja ma przydzielone 6 MB, powinno być dobrze, ale 8 MB przesunie ją, czy w przydziale pamięci są takie ograniczenia? Jeszcze raz dziękuję Alex Lockwood za twoją odpowiedź. Będę czytał i ponownie czytał, dopóki te rzeczy nie będą miały dla mnie sensu

questionAnswers(2)

yourAnswerToTheQuestion