1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Wie kann man den Speicherverbrauch prüfen?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von GMoN, 25.09.2010.

  1. GMoN, 25.09.2010 #1
    GMoN

    GMoN Threadstarter Android-Lexikon

    Beiträge:
    1,132
    Erhaltene Danke:
    130
    Registriert seit:
    01.02.2009
    Ich schreibe sehr viele Daten in eine Arraylist. Das kann bei sehr vielen Daten zu Heap Speicher Problemen führen. Jetzt wollte ich mal schauen, wieviel speicher denn meine app nun wirklich bei wievielen Daten belegt. Ich bekomme aber leider keine brauchbaren Anzeigen. Im DDMS steht immer Heap size 3,4 MB und Allocated 2,4 MB, egal ob 0 Datensätze oder 100.000 geladen sind.

    Code:
    Log.v(TAG, "Service Heap size: "+android.os.Debug.getNativeHeapSize()/1024);
    Log.v(TAG, "Service Heap free: "+android.os.Debug.getNativeHeapFreeSize()/1024);
    Log.v(TAG, "Service Heap alloc: "+android.os.Debug.getNativeHeapAllocatedSize()/1024);
    Liefern auch immer bei size und Allocated ca. 7MB. Auch ändert sich gar nichts, wenn ich im Programm nach dem Laden der Daten die Arraylist mit .clear() lösche und null setze.

    Auch habe ich festgestellt, dass das Milestone 24MB max. Heap size hat und das N1, obwohl sogar etwas mehr Speicher nur 16MB hat, beide mit original ROM, das N1 natürlich mit Froyo.

    Wie kann ich jetzt möglichst genau den Speicherverbrauch meiner Activity und des services monitoren? Am besten mit Speichergrößen Anzeige jeder Arraylist. Geht sowas?
     
  2. BenOtto, 26.09.2010 #2
    BenOtto

    BenOtto Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    15
    Registriert seit:
    30.08.2010
    Also DDMS bringt 2 Tools mit. "Heap" und "Allocation Tracker". Wenn du bei Devices deine laufende App auswählst und auf den "Update Heap" Button drückst (der grüne, ohne roten Pfeil), dann kannst du im Fenster rechts daneben auf den Tab Heap wechseln und siehst dort wieviel Speicher allokiert ist. Immer, wenn der GC durchläuft updated sich die Speicheranzahl. Man kann den GC auch gezielt starten, um ein update zu erhalten (per Klick auf "Cause GC"). Außerdem werden dadrunter die Typen der allokierten Objekte angezeigt. Bei einer ArrayList werden das dann wahrscheinlich "Data Objects" sein.

    Mit dem Allocation Tracker kannst du gezielt überprüfen, wann besonders viele Allokationen gemacht wurde. Dazu einfach auf Start Tracking klicken, dann die gewünschte Aktion im Emulator (oder Device) durchführen und auf Get Allocations drücken.
     
  3. GMoN, 26.09.2010 #3
    GMoN

    GMoN Threadstarter Android-Lexikon

    Beiträge:
    1,132
    Erhaltene Danke:
    130
    Registriert seit:
    01.02.2009
    Da scheint mein Problem zu stecken. Unter den Devices finde ich meine App nicht. Da ist nur das Handy und com.google.android.apps.uploader. Oder geht das nur im Emulator? Ich nutze den Emulator nicht, sondern nur das Milestone oder das Nexus. Oder muss ich in der App noch irgendwie den debug Modus aktivieren? Logcat funktioniert aber.
     
  4. BenOtto, 26.09.2010 #4
    BenOtto

    BenOtto Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    15
    Registriert seit:
    30.08.2010
    Vermutlich hast du im Manifest nicht deklariert, dass die App debuggable ist. Drück mal unter <application... android:debuggable="true" rein.
     
    GMoN bedankt sich.
  5. GMoN, 26.09.2010 #5
    GMoN

    GMoN Threadstarter Android-Lexikon

    Beiträge:
    1,132
    Erhaltene Danke:
    130
    Registriert seit:
    01.02.2009
    Ok Danke, im DDMS kommen jetzt plausible Werte. Allerdings kommen bei android.os.Debug.getNativeHeapSize()/1024 immer noch völlig falsche Werte. Muss da auch noch was beachtet werden, wenn man die Werte im Programme auslesen möchte?
     

Diese Seite empfehlen