Android Understanding Heap Größen

Ich bin ziemlich neu in Android Entwicklung, und ich kann nicht scheinen, um zu begreifen, das Java Out of Memory-Ausnahme. Ich weiß, es bedeutet, dass meine app hat den Weg über die VM-budget, aber nach Googeln, das viele Male bin ich immer noch nicht scheinen zu begreifen, dieses Konzept. Ich habe Angst, dass meine app zu viel Speicher verwendet, denn ich habe sechs button-Selektoren pro Bildschirm mit zwei bitmaps für jeden Selektor die rund 20 kb gemäß der Registerkarte "Eigenschaften". Auf meinem verwurzelt G2x ich habe den VM budget zu 12mb,neu gestartet, mein Handy und lief meine app mit überhaupt keine Probleme. Ich bin unverbindlich drawables auf jeden onDestroy() und Anspielungen auf die GC zu laufen hier auch. Nach der Verwendung der app für eine Weile in die emulator ich auf "Cause GC" auf meinem DDMS Bildschirm und die Ergebnisse werden
ID=1, Heap-Größe 6.133 MB, Reserviert 2.895 MB, Frei 3.238 MB, % 47.20, # Objekte 52,623.

Dies ist, wo ich nicht verstehe, was passiert, mein emulator ist eingestellt, um die 24MB, VM. Wo ist diese Zahl? Das eigentliche problem das ich habe ist, dass wenn ich den emulator zu 16MB VM meine app stürzt auf die zweite Aktivität, mit der Out-of-Memory-Ausnahme. Wie kommt es, das es keinen Absturz auf meinem Handy mit der VM set zu 12 MB oder auf meinem alten HTC Magic Handy mit 12-MB-VM Lager? Auch haben Sie Jungs denken, dass meine app zu viel Speicher? Ich habe keine Ahnung, ob diese DDMS zahlen gut sind oder nicht. Vielen Dank für Ihre Zeit.

Als für meinen code habe ich jedes Bild in XML spezifiziert, layouts, ich Tue nichts, programmaticly mit Ihnen, außer für das hinzufügen von Listenern zu Ihnen. Ich fand das bisschen code hier und ich habe ihn Hinzugefügt, um jede Aktivität, die ich habe...

@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();
    }
}

Sonst alle ich tun ist, fügen Sie onClickListeners auf die Tasten, dass die PNG-Hintergründe. Ich möchte lernen, wie man geben Sie Schaltfläche hintergrund programmaticly aber ich muss die selector-Funktionen, wie auf die Konzentration, auf Presse, die nicht konzentriert, sondern drückte etc. um die button-Hintergründe ändern sich je nach Benutzer-Interaktion. Ich haben überprüft, dass die docs sich darüber, aber es scheint überwältigend, das ist, warum ich dachte, ich würde hier anfangen mit den Grundlagen der Verwaltung Haufen und meinen Weg bis zu der Angabe von Selektoren im code. Dies kann nicht Sinn machen, aber gibt es eine "gesunde" Menge der Speicher-Zuweisung, könnte eine app zuordnen, ohne immer in der Nähe der Out-of-Memory-Ausnahme? Zum Beispiel, wenn eine app zugeordnet 6MB sollte es in Ordnung sein, aber 8MB würde ihn drängen, gibt es Grenzen, so dass in der Speicher-Aufteilung? Nochmals vielen Dank Alex Lockwood für Ihre Antwort, ich werde Lesen und wieder Lesen Sie wieder, bis das Zeug macht Sinn für mich

InformationsquelleAutor der Frage John P. | 2012-05-20

Schreibe einen Kommentar