Android Verständnis Heap Größen

Ich bin ziemlich neu für Android-Entwicklung und ich kann nicht scheinen, um die Java Out of Memory Ausnahme zu begreifen. Ich weiss es bedeutet, dass meine App über das VM-Budget gegangen ist, aber nach Googeln das oft ich noch nicht scheinen, dieses Konzept zu begreifen. Ich habe Angst, dass meine App zu viel Speicher verwendet, weil ich sechs Tastenwähler pro Bildschirm mit zwei Bitmaps für jeden Selektor habe, die je nach der Registerkarte Eigenschaften etwa 20 kb sind. Auf meinem verwurzelten G2x habe ich das VM Budget auf 12mb eingestellt, mein Telefon neu gestartet und meine App ohne Probleme gelaufen. Ich bin ungebundene Ziehbar auf jedem onDestroy () und zeige auf den GC, um hier auch zu rennen. Nachdem ich die App für eine Weile im Emulator benutzt habe, klicke ich auf meinem DDMS-Bildschirm auf "Cause GC" und die Ergebnisse sind ID = 1, Heap Size 6.133 MB, Allocated 2.895MB, Free 3.238 MB,% Gebraucht 47.20, # Objekte 52.623.

Dies ist, wo ich nicht verstehe, was passiert, ist mein Emulator auf 24MB VM gesetzt. Wo ist diese Nummer? Das eigentliche Problem, das ich habe, ist, dass, wenn ich den Emulator auf 16MB von VM setzen meine App abstürzt auf der zweiten Aktivität mit der Out of Memory Ausnahme. Wie kommt es nicht auf meinem Handy mit dem VM auf 12 MB oder auf meinem alten HTC Magic Telefon mit 12 MB VM Lager? Auch glaubst du, dass meine App zu viel Gedächtnis aufnimmt? Ich habe keine Ahnung, ob diese DDMS-Nummern gut sind oder nicht. Dank für Ihre Zeit.

  • Hinzufügen einer externen Bibliothek im Android Studio
  • Bug: Theme.Translucent & FLAG_ACTIVITY_REORDER_TO_FRONT
  • Eine etablierte Verbindung wurde von der Software in Ihrem Host-Rechner abgebrochen
  • Android Map V2 - Warum MAPS_RECEIVE Berechtigung
  • So stellen Sie Single Choice Items in AlertDialog ein?
  • Ausnahme - Fehler beim Auflösen des Attributs bei Index 6: TypedValue
  • Wie für meinen Code habe ich jedes Bild in XML-Layouts angegeben Ich mache nichts programmgesteuert mit ihnen, außer für das Hinzufügen von Zuhörern zu ihnen. Ich fand dieses Stückchen Code hier und ich habe es zu jeder Aktivität hinzugefügt, 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(); } } 

    Ansonsten alles, was ich tue, füge onClickListeners zu den Schaltflächen hinzu, die die PNG-Hintergründe haben. Ich möchte lernen, wie man Tastenhintergründe programmgesteuert spezifiziert, aber ich muss die Selektorfunktionen wie auf Fokus haben, auf Presse, nicht fokussiert aber gedrückt usw., um die Schaltflächenhintergründe entsprechend der Benutzerinteraktion zu ändern. Ich habe die Docs darüber überprüft, aber es scheint überwältigend, deshalb habe ich gedacht, dass ich hier mit den Grundlagen des Managements von Heaps beginnen und meinen Weg bis zur Spezifizierung von Selektoren in Code. Dies kann nicht sinnvoll sein, aber gibt es eine "gesunde" Menge an Speicherzuteilung, die eine App zuweisen könnte, ohne sich der Ausnahme von Ausnahme zu öffnen Zum Beispiel, wenn eine App 6MB zugewiesen wurde, sollte es gut sein, aber 8MB würde es drängen, gibt es so Grenzen in der Speicherzuteilung? Nochmals vielen Dank Alex Lockwood für deine Antwort Ich werde es lesen und neu lesen, bis dieses Zeug für mich Sinn macht

  • InApp Billing: java.lang.SecurityException Benötigt READ_PHONE_STATE
  • Der aktualisierte APK kann nicht in den Google Play Store geladen werden
  • Android und ActionBarCompat: Wie kann man die Sichtbarkeit von Aktionen zur Laufzeit auf Pre-ICS-Geräten ändern?
  • Wifi Authentifizierungsfehler in Android
  • Wie kann ich den aktuellen Standort in der Google Map anzeigen?
  • Lineare Beschleunigungsrichtung, um die Aufwärts- und Abwärtsbewegung des Telefons zu verfolgen
  • 2 Solutions collect form web for “Android Verständnis Heap Größen”

    Wenn du das VM-Budget auf deinem Emulator / deinem Gerät steckst, was du tust, erzählt der Haufen die maximale Größe, die es sein darf. Zur Laufzeit wächst der Heap dynamisch in der Größe, wie die Dalvik VM Systemspeicher aus dem Betriebssystem anfordert. Die Dalvik VM beginnt typischerweise mit einem relativ kleinen Haufen. Dann nach jedem GC-Lauf es überprüft, um zu sehen, wie viel freier Heap-Speicher gibt es. Wenn das Verhältnis von freiem Haufen zu Gesamthaufen zu klein ist, wird die Dalvik VM dann mehr Speicher zum Haufen hinzufügen (bis zur maximal konfigurierten Heapgröße).

    Das heißt, der Grund, warum Sie nicht sehen "24 mb" auf Ihrem DDMS-Bildschirm ist, weil der Haufen nicht zu seiner maximalen Größe gewachsen ist. Dies ermöglicht es Android, den bereits geringen Speicherplatz, der auf Handheld-Geräten zur Verfügung steht, gut zu nutzen.

    Wieso, warum Ihre Anwendung auf dem Emulator und nicht Ihr Telefon abstürzt, scheint das seltsam (sind Sie sicher, dass die Zahlen korrekt sind?). Sie sollten jedoch im Auge behalten, dass Speicher dynamisch verwaltet wird und dass die Gesamtspeicherauslastung auf der Grundlage einer Anzahl von externen Faktoren bestimmt wird (die Geschwindigkeit / Häufigkeit, bei der die Garbage Collection durchgeführt wird usw.).

    Schließlich, aus den Gründen, die ich oben erwähnt habe, wäre es schwierig, sicher zu sagen, wie gut Ihre Anwendung verwaltet Speicher auf der Grundlage der einzelnen Zeile der Informationen, die Sie oben gegeben haben. Wir müssen wirklich etwas von Ihrem Code sehen. OutOfMemoryError s sind definitiv wert, sich Sorgen zu machen, aber so würde ich definitiv in die Anwendung deiner Anwendung nutzen. Eine Sache, die Sie vielleicht betrachten, ist, Ihre Bitmap-Bilder zur Laufzeit mit Anrufen in inSampleSize mit der BitmapFactory Klasse BitmapFactory . Dies kann dazu beitragen, die Menge an Speicher zu reduzieren, die benötigt wird, um Ihre zeichenkbaren Bitmaps zu laden. Entweder das oder du könntest die Auflösung deines Drawables reduzieren (obwohl 20 kb jeder klingt gut zu mir).

    Auch wenn Ihre Anwendung nicht erreichen die "24mb" (variiert innerhalb von Geräten) Heap-Limit Sie vielleicht noch Abstürze, weil Android eine Weile dauert, um den Haufen Platz für Ihre App zu wachsen.

    In meiner Situation habe ich mehrere Bilder in einer kleinen Zeit erstellt und entleert.

    Häufig bekam ich OutOfMemoryError .

    Es scheint, Android war nicht schnell genug, um den Haufen Platz für meine App zu wachsen.

    Ich glaube, ich habe dieses Problem gelöst, indem ich die largeHeap Einstellung in der Manifest-Datei verwende. Mit dieser Einstellung auf, Android verlässt mehr freien Speicher jedes Mal, wenn es den Haufen wächst, minimiert die Chance, die aktuelle Grenze zu schlagen.

    Ich benutze nicht die 24mb Begrenzung, aber dieser largeHeap conf war ziemlich praktisch.

    Sie müssen nur largeHeap="true" auf dem Anwendungs-Tag Ihrer AndroidManifest.xml

     <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:largeHeap="true" android:theme="@style/AppTheme" > 

    Dennoch stellen Sie sicher, dass Sie vorsichtig sind, wenn es um Bilder geht, wie @Alex Lockwood beraten.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.