Ich habe 4 volle Tage damit verbracht, alles zu versuchen, um den Speicherverlust in einer App herauszufinden, die ich entwickle, aber die Dinge haben vor langer Zeit keinen Sinn mehr ergeben.
Die App, die ich entwickle, ist sozialer Natur. Denken Sie also an Profilaktivitäten (P) und listen Sie Aktivitäten mit Daten auf - zum Beispiel Abzeichen (B). Sie können vom Profil zu einer Ausweisliste zu anderen Profilen, zu anderen Listen usw. springen.
Stellen Sie sich also einen Fluss wie diesen vor: P1 -> B1 -> P2 -> B2 -> P3 -> B3 usw. Aus Gründen der Konsistenz lade ich Profile und Abzeichen desselben Benutzers, sodass jede P-Seite gleich ist und so ist jede B-Seite.
Der allgemeine Kern des Problems ist: Nach einigem Navigieren, abhängig von der Größe jeder Seite, wird an zufälligen Stellen - Bitmaps, Strings usw. - eine Ausnahme wegen Speichermangel angezeigt. Diese scheint nicht konsistent zu sein.
Nachdem ich alles Mögliche getan habe, um herauszufinden, warum mir das Gedächtnis ausgeht, habe ich mir nichts ausgedacht. Was ich nicht verstehe, ist, warum Android P1, B1 usw. nicht beendet, wenn beim Laden nicht genügend Speicherplatz zur Verfügung steht und stattdessen abstürzt. Ich würde erwarten, dass diese früheren Aktivitäten sterben und wiederbelebt werden, wenn ich jemals über onCreate () und onRestoreInstanceState () zu ihnen zurückkehre.
Geschweige denn - selbst wenn ich P1 -> B1 -> Zurück -> B1 -> Zurück -> B1 mache, bekomme ich immer noch einen Absturz. Dies deutet auf eine Art Speicherverlust hin, aber selbst nach dem Dumping von hprof und der Verwendung von MAT und JProfiler kann ich es nicht genau bestimmen.
Ich habe das Laden von Bildern aus dem Web deaktiviert (und die geladenen Testdaten erhöht, um dies auszugleichen und den Test fair zu gestalten) und sichergestellt, dass der Bildcache SoftReferences verwendet. Android versucht tatsächlich, die wenigen SoftReferences freizugeben, die es hat, aber kurz bevor es aus dem Speicher abstürzt.
Ausweisseiten rufen Daten aus dem Web ab, laden sie von einem BaseAdapter in ein Array von EntityData und geben sie an eine ListView weiter (ich verwende tatsächlich den ausgezeichneten MergeAdapter von CommonsWare , aber in dieser Ausweisaktivität gibt es sowieso nur 1 Adapter, aber ich wollte diese Tatsache so oder so erwähnen).
Ich habe den Code durchgesehen und konnte nichts finden, was auslaufen würde. Ich habe alles gelöscht und auf Null gesetzt, was ich finden konnte, und sogar System.gc () links und rechts, aber die App stürzt immer noch ab.
Ich verstehe immer noch nicht, warum inaktive Aktivitäten, die sich auf dem Stapel befinden, nicht geerntet werden, und ich würde das wirklich gerne herausfinden.
An dieser Stelle suche ich nach Hinweisen, Ratschlägen, Lösungen ... allem, was helfen könnte.
Danke dir.
outOfMemory
Fehlermeldung. Vielen Dank!