5

Ich habe zufällig (nicht genügend Arbeitsspeicher) Abstürze in meiner App, so begann ich meinen Haufen zu analysieren. Ich habe bemerkt, dass, wenn ich von Aktivität A zu Aktivität B gehe, der Heap (aufgrund des langsamen Ladens vieler Bilder) von 27 MB auf 35 MB steigt. Wenn ich jedoch() die Aktivität B beendet habe, um zu Aktivität A zurückzukehren, bleibt die Größe des Heapspeichers auch bei GC-Operation gleich.Android App Speicher Heap wächst weiter

Die ärgerliche Sache ist, dass die Aktivität B noch einmal erhöht den Heap auf 42 MB erhöht. Ich kann das tun wie es Zeiten und der Haufen wird nur weiter zunehmen.

Dies ist die faulen Bilder Laden Bibliothek ich verwende:

LazyList https://github.com/thest1/LazyList

Dies sind Screenshots der Heap

vor: http://i.stack.imgur.com/7eTzm.png

nach: http://i.stack.imgur.com/txeC6.png

umgewandelt Heap-Dump-Datei ist auf Anfrage erhältlich

UPDATE

Aus meiner Debugging, so scheint es, das Problem aus der LazyList Bibliothek, aber ich bin noch nicht 100% sicher. Hier wird auf die Menschen auf der Bibliothek zu kommentieren:

https://github.com/thest1/LazyList/issues/20

+0

Klingt so, als würden bei Ihrer Aktivität Daten verloren gehen. Haben Sie IPC-Mitgliedsvariablen oder irgendetwas anderes, das ohne Aktivität weiterlaufen kann? –

+0

Keine IPCs Zum Fortfahren ohne Aktivität verwendet die Bibliothek, die ich verwende, mehrere Threads (die Auto ohne Aktivität ausgeführt werden). – AlAsiri

+0

haben Sie dieses Problem zu lösen, dann bitte Feedback wird erwartet .. –

Antwort

1

Meine Vermutung ist, dass Sie die Aktivität sind undicht (was wahrscheinlich alle Variablen würde auslaufen es hält). Stellen Sie sicher, dass alle OS-Aufrufe, für die Sie einen Kontext übergeben müssen, nicht registriert sind, dass Sie keine Objekte mit einem Verweis auf die Aktivität haben (insbesondere über das Halten eines Kontextes) und dass Sie alles außer Kraft setzen, was Sie in onDestroy können oder onStop (und das auch in allen deinen Hauptobjekten).

Wenn das nicht genug ist, sehen Sie sich Ihren hprof an und sehen Sie, welche großen Objekte herumliegen, nachdem Sie die Aktivität beendet haben und wer die Referenzen hält. Fix und wiederholen.

+0

Wie kann ich OS-Aufruf, das erfordert, um den Kontext übergeben? Können Sie mir ein Beispiel zeigen? – AlAsiri

+0

Wo verwenden Sie den Kontext? Wenn es in einem Zuhörer ist, müssen Sie es möglicherweise loswerden. Aber im Allgemeinen glaube ich nicht, dass Sie auch einen Verweis von Aktivität A auf Aktivität B haben müssen, wie immer. – dmon

+0

Dem stimme ich zu. Aber es ist nicht ungewöhnlich, Context-Objekte an Listener oder Datenobjekte zu übergeben, die sie als Member-Variablen speichern, und wenn Sie diese nicht ausschließen, werden Sie undicht. Es ist sogar nicht unüblich, sich später zu entscheiden, diese Variablen Singletons oder Globals zu machen, und nicht an diese Kontextvariable zu denken (heck, vielleicht wurde sie sogar in den Konstruktor eines anderen Objekts gegeben, der das tut, aber Sie haben nur das ursprüngliche Objekt herumliegen)). Häufige Gründe hierfür sind Zugriffe auf SharedPreferences oder XXXManager-Klassen. –

1

Es klingt für mich so, als ob Sie jedes Mal eine neue Aktivität beginnen, anstatt zu der bereits geladenen zu wechseln. Versuchen Sie, die Flags für die Absicht so festzulegen, dass sie Intent.FLAG_ACTIVITY_REORDER_TO_FRONT enthält, wenn Sie die Aktivitäten wechseln.

See this

+0

versuchte die Flagge aber trotzdem. Ich glaube, das ist nicht das Problem – AlAsiri

+0

Ich denke, das ist nicht das Problem, da die bereits offene Aktivität sollte sauber sein, durch GC, der Grund ist aufgrund Speicher durchgesickert, wo die Aktivität Verweis von einigen Verweis gehalten wird und die Aktivität Instanz ist nicht sauber. –

0

mir scheint es, die Bilder könnten Sie verwenden. Die BitmapFactory from Android erstellt unveränderliche Bitmaps und alle Änderungen, die Sie an diesen Bitmaps vornehmen, werden daher vom Originalbild getrennt.

Schlimmer noch, selbst wenn Sie es zu recycle sagen, wird es von Ihren Referenzen abhängen, wenn es Müll-gesammelt wird.

+0

Ich denke auch Sie denken, dass ein SoftRefence dieses Problem lösen würde? – AlAsiri

+0

Ich wäre eher geneigt, den Rat zu verwenden, der hier angeboten wird: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html. Das hier: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html scheint besonders relevant zu sein. – DigCamara

Verwandte Themen