Bitmap, Bitmap.recycle (), WeakReferences und Garbage Collection

Bei AFAIK unter Android empfiehlt es sich, Bitmap-Objekte als WeakReferences zu referenzieren, um Speicherlecks zu vermeiden. Wenn keine harten Referenzen mehr für ein Bitmap-Objekt vorhanden sind, wird der Garbage Collector sie automatisch erfassen.

Nun, wenn ich es richtig verstanden habe, muss immer die Methode Bitmap.recycle () aufgerufen werden, um eine Bitmap freizugeben. Ich denke, das liegt daran, dass Bitmap-Objekte spezielle Speicherverwaltung haben.

Ist das korrekt?

Wenn dies zutrifft, müssen bei der Verwendung von WeakReferences Speicherlecks auftreten, da Bitmap.recycle () niemals aufgerufen wird, wenn die WeakReferences freigegeben werden. Oder sind WeakReferences ausreichend, um Speicherlecks zu vermeiden?

Vielen Dank

Bitamp.recycle muss nicht aufgerufen werden, da der Garbage Collector Bitmaps selbständig aufräumt (solange keine Referenzen vorhanden sind). Bitmaps in Android werden im nativen Speicher und nicht im VM-Heap erstellt. Daher ist das tatsächliche Bitmap-Objekt im VM-Heap sehr klein, da es keine tatsächlichen Bitmap-Daten enthält. (BEARBEITEN: ab Android 3.0+ nicht mehr der Fall) Die tatsächliche Größe der Bitmap wird weiterhin für die Nutzung des Heapspeichers zu GC-Zwecken gezählt und dafür gesorgt, dass Ihre App nicht zu viel Arbeitsspeicher belegt.

Allerdings scheint der GC ein wenig launisch zu sein, wenn es um Bitmaps geht. Wenn Sie nur alle harten Referenzen entfernen, würde es manchmal (in meinem Fall) noch etwas länger an den Bitmaps hängen, vielleicht wegen der seltsamen Art, wie Bitmap-Objekte zugewiesen / gezählt werden. Bitmap.recycle scheint gut dafür zu sein, dass der GC das Objekt schneller sammelt.

In beiden Fällen werden Sie keinen Speicher verlieren, wenn Sie Bitmap.recycle nicht aufrufen, solange Sie keine harten Referenzen versehentlich beibehalten. Sie können auf OutOfMemoryErrors stoßen, wenn Sie versuchen, zu viele Bitmaps auf einmal oder zu große Bitmaps zuzuweisen, ohne jedoch .recycle aufzurufen.

BEARBEITEN: Es ist wichtig zu beachten, dass ab Android 3.0 Bitmaps nicht mehr im nativen Speicher zugeordnet sind. Diese werden wie alle anderen Java-Objekte auf dem VM-Heap zugeordnet. Was ich jedoch gesagt habe, dass ich den Recycle nicht anrufen muss, gilt immer noch.