Ich habe eine Anwendung, die eine Reihe von Bitmaps erstellt. Ich halte diese Bitmaps in SoftReferences, um einen Speicherüberlauf zu vermeiden. Ich möchte, dass die Heap-Größe auf das maximale 16 MB wächst, bevor meine SoftReferences gesammelt werden. Allerdings werden die SoftReferences sehr eifrig gesammelt, bevor der Heap sein Maximum erreicht. Gibt es eine Möglichkeit, die Referenzen weniger eifrig zu sammeln? Oder den Heap manuell auf das Maximum zu erweitern? Möglicherweise eine Möglichkeit, die Anwendung einfach mit 16 MB zu starten?
Antworten
Zu viele Anzeigen?Derzeit gibt es keine Möglichkeit, das Verhalten der SoftReference-Sammlung zu ändern.
Ich bin mir nicht sicher, was Sie mit "manuell das Heap auf das Maximum vergrößern" meinen.
Wenn es sich um Instanzen der Bitmap-Klasse handelt (anstelle einer benutzerdefinierten Bitmap-Implementierung) werden die Pixeldaten tatsächlich im nativen Heap gespeichert, verwenden jedoch einen lästigen "externe Zuweisung" Trick zur Buchführung, was die Situation weiter kompliziert. (Bemerkenswert ist, dass der Speicher durch einen Finalizer und nicht durch den GC freigegeben wird, und Finalizer müssen in einem separaten Thread nach Abschluss des GC ausgeführt werden. Es ist möglich, Bitmaps zuzuweisen, bis der Speicher erschöpft ist, und der GC keine Möglichkeit hat, den Speicher freizugeben, bevor ein OOM-Fehler auftritt.)
Es handelt sich um ein bekanntes Problem in Andriod. Wenn der VM Soft-Verweise sammelt, sammelt er entweder alle oder keine, obwohl er 'einige' sammeln sollte und nichts sammeln sollte, wenn genügend freier Heap vorhanden ist.
Überprüfen Sie: http://code-gotcha.blogspot.com/2011/09/softreference.html