Wie viel Heap darf meine App haben, um auf (allen) Geräten zu laufen.

  • Antworten:4
Artur Hellmann
  • Forum-Beiträge: 12

24.07.2014, 08:00:55 via Website

Hi Leute,

ich habe folgendes Problem:
Ich bekomme in meiner Developer Console einen Absturz von einem Lifetab P9514 einen Absturz gemeldet:

java.lang.OutOfMemoryError
in android.graphics.BitmapFactory.nativeDecodeAsset

leider kann ich das Problem nirgends nachstellen. Der User hat eine Userbeschreibung des Fehlers hinterlassen. Somit habe ich mir mal die Benutzung des Heap durch meine App genau bei der Tätigkeit angesehen.

Die App ist eigentlich durchgehend bei 24MB. Wie findet ihr diesen Wert. Ist das viel?

Gleich bei der ersten Version habe ich schon auf saubere Speicherverwaltung geachtet (zumindest nach meinem besten Wissen und Gewissen) und habe auch über die trimMemory() Funktion versucht auf solche Geschichten zu achten.

Das Problem ist, ich habe einfach nicht viele Referenzen auf Objekte, wodurch der GC natürlich sauber machen kann.

Hilft es, den GC auch mal Manuel aufzurufen, z. B. am Ende der onCreate Funktion?
Aber wie soll ich das tun, wenn des Fehler in der BitmapFactory auftritt, für dessen Aufruf ich gar nicht verantwortlich bin.

Bitte um Ratschläge und Hilfe!

Danke

Artur

Antworten
Daniel
  • Forum-Beiträge: 177

24.07.2014, 08:39:18 via Website

Die App ist eigentlich durchgehend bei 24MB. Wie findet ihr diesen Wert. Ist das viel?

Bist du dir sicher, dass du diesen Wert auch nicht kurzzeitig überschreitest? Am besten setzt du dir einen Emulator mit geringer Heapsize auf und testest die App darin.

24 MB sind meiner Meinung nach kein zu hoher Wert, aber es gibt ältere Geräte die weniger Heap zur Verfügung haben. Hier findest du eine Auflistung von Geräten samt Heap Size: http://stackoverflow.com/a/9940415

Hilft es, den GC auch mal Manuel aufzurufen

Ab Android 4 bringt manuelles Aufrufen des GC nichts mehr. Davor schon, denn bei alten Versionen waren immer 2 GC Läufe nötig um ein Bitmap vollständig vom Heap zu entfernen.

Antworten
Sven R.
  • Forum-Beiträge: 1.904

24.07.2014, 09:39:04 via App

In meiner App hatte ich auch Speicherprobleme. Fürs Erste habe ich den GC manuell aufgerufen, und es hat wirklich was gebracht. Mit System.gc() geht das. Letztendlich habe ich die App dann aber effizienter gestaltet und dann war das manuelle Aufrufen unnötig.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Artur Hellmann
  • Forum-Beiträge: 12

24.07.2014, 09:53:12 via Website

Sven Rahn

In meiner App hatte ich auch Speicherprobleme. Fürs Erste habe ich den GC manuell aufgerufen, und es hat wirklich was gebracht. Mit System.gc() geht das. Letztendlich habe ich die App dann aber effizienter gestaltet und dann war das manuelle Aufrufen unnötig.

Hi,

ich werde mal versuchen den GC jedes Mal, nachdem ich meine Objektreferenzen freigegeben habe, aufzurufen. Vielleicht hilft es was.

Welche Praktiken hast du verwendet, um deine App speicherplatzeffizienter zu gestalten? Weißt du wie viel Heap deine App im Moment benötigt?

lg

Artur

Antworten
Sven R.
  • Forum-Beiträge: 1.904

24.07.2014, 12:16:00 via App

Nein, ich habe nie die Heap Size geändert oder nur angeguckt. Es gab halt einen OutOfMemory.
Mein Problem war, dass ich ein sehr großes View mit vielen kleinen Views drin in einer Schleife erzeugt habe. Alle Instanzen zu den Views sind nicht freigegeben worden. Das ganze habe ich mit einem Adapter für eine ListView gelöst.

Tipp: Lass die Bilder in einer niedrigeren Auflösung laden.

— geändert am 24.07.2014, 12:16:56

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten