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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie die VM-budget auf Ihrem emulator/device, was du tust, ist erzählen die heap die maximale Größe es sein darf. Zur Laufzeit den heap wächst dynamisch in der Größe wie die Dalvik VM-Anforderungen system-Speicher aus dem Betriebssystem. Die Dalvik VM startet in der Regel durch Vergabe einer relativ kleinen Haufen. Dann nach jedem GC-Lauf überprüft, um zu sehen, wie viel heap-Speicher es gibt. Wenn das Verhältnis der freien heap, insgesamt heap ist zu klein, die Dalvik VM wird dann fügen Sie mehr Speicher auf dem heap (bis auf die konfigurierte maximale heap-Größe).
Dass gesagt wird, der Grund, warum Sie nicht sehen, "24 mb" auf Ihrem DDMS Bildschirm ist, weil der Haufen noch nicht gewachsen, seine maximale Größe. Dies ermöglicht Android zu nutzen, den bereits kleine Menge an Speicher, die verfügbar ist auf handheld-Geräten.
Als für den Grund, warum Ihre Anwendung abstürzt, auf dem emulator und nicht das Handy, dass scheint seltsam (bist du sicher, dass die zahlen korrekt sind?). Sie sollten im Hinterkopf behalten, jedoch, dass der Speicher wird dynamisch verwaltet und, dass die Gesamtzahl der Speicher-Auslastung bestimmt wird basierend auf einer Reihe von externen Faktoren (Geschwindigkeit/Frequenz, bei der die garbage collection ausgeführt wird, etc.).
Schließlich aus den Gründen, die ich oben erwähnt habe, würde es schwierig sein, sicher zu sagen, wie gut Ihre Anwendung verwaltet die Speicher, basierend auf die einzelne Zeile von Informationen, die Sie zur Verfügung gestellt oben. Wir würden wirklich brauchen, um zu sehen, einige Ihrer code.
OutOfMemoryError
s auf jeden Fall Wert sind, sich sorgen darüber, aber so würde ich auf jeden Fall schauen Sie in Ihrer Anwendung ein memory usage. Eine Sache, die Sie vielleicht erwägen, zum Beispiel, Ihre bitmap-Bilder zur Laufzeit mit anrufen zuinSampleSize
mit derBitmapFactory
Klasse. Dies kann helfen, reduzieren die Menge an Speicher, die benötigt werden, um laden Sie Ihre drawable-bitmaps. Entweder das, oder Sie könnten reduzieren Sie die Auflösung Ihrer drawables (obwohl 20 kb klingt in Ordnung für mich).InformationsquelleAutor der Antwort Alex Lockwood
Selbst wenn Ihre Anwendung nicht erreichen "24mb" (variiert innerhalb der Geräte) heap begrenzen, könnten Sie immer noch abstürzt, weil Android eine Weile dauert, wächst der heap-Speicher für Ihre app.
In meiner situation, die ich erstellen und Abladen mehrere Bilder in einer kleinen Menge Zeit.
Ziemlich oft, ich war immer
OutOfMemoryError
.Scheint es Android noch nicht schnell genug, wächst der heap-space für meine app.
Ich glaube, ich löste dieses Problem, indem Sie die
largeHeap
Einstellung in der Manifest-Datei.Mit dieser Einstellung, Android lässt mehr freien Speicher jedes mal, wenn es wächst der heap, minimieren Sie die chance des Schlagens der Strombegrenzung.
Glaube ich nicht das die 24mb zu beschränken, sondern diese
largeHeap
conf war ganz praktisch.Müssen Sie nur festlegen
largeHeap="true"
auf dem application-tag IhrerAndroidManifest.xml
Immer noch, stellen Sie sicher, Sie sind vorsichtig, wenn Umgang mit Bildern, wie @Alex Lockwood geraten.
InformationsquelleAutor der Antwort tbraun