Bitmap, Bitmap.recycle (), WeakReferences und Garbage Collection
AFAIK auf Android, ist es empfehlenswert, die Referenz Bitmap-Objekte wie WeakReferences zur Vermeidung von Speicherlecks. Wenn keine harten Verweise sind gehalten, ein bitmap-Objekt vom garbage collector automatisch sammeln.
Nun, wenn ich das richtig verstehe, wird die Methode Bitmap.recycle() muss immer aufgerufen werden, um eine Bitmap. Ich denke, das ist, weil Bitmap-Objekte haben spezielle Speicherverwaltung.
Ist das richtig?
Wenn das wahr ist, wenn mit WeakReferences, muss es memory leaks, weil Bitmap.recycle() wird niemals aufgerufen, wenn der WeakReferences sind befreit. Oder, irgendwie, WeakReferences sind ausreichend, um Speicherverluste zu vermeiden?
Dank
InformationsquelleAutor der Frage Sly | 2011-02-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bitamp.Recycling ist nicht erforderlich genannt zu werden, da der garbage collector Aufräumen bitmaps auf seine eigene Zeit (wie lange, wie es keine Referenzen). Bitmaps in Android erstellt werden, der im systemeigenen Speicher, nicht auf der VM-heap, so dass die tatsächlichen Bitmap-Objekt auf den VM-heap ist sehr klein, da Sie nicht enthalten keine eigentlichen bitmap Daten. (EDIT: nicht mehr der Fall, da Android 3.0+) Die tatsächliche Größe der bitmap wird immer noch gezählt werden, gegen Ihre heap-Nutzung für Zwecke des GC und sicherzustellen, dass Ihre app nicht verwenden zu viel Speicher.
Jedoch, die GC zu sein scheint ein wenig launisch, wenn es um Bitmaps. Wenn Sie nur entfernen Sie alle harten Verweise, wäre es manchmal (in meinem Fall) hängen auf die Bitmaps, die für eine kleine Weile länger, vielleicht wegen der seltsamen Art und Weise Bitmap-Objekte zugeordnet/gezählt. Bitmap.Recycling scheint gut zu sein für das erhalten der GC zu sammeln, das Objekt schneller.
Entweder Weg, werden Sie nicht Leck Speicher, wenn Sie nicht rufen Sie Bitmap.Recycling, wie lange, wie Sie nicht schwer zu halten Referenzen versehen. Sie stoßen können OutOfMemoryErrors, wenn Sie versuchen, zu reservieren, zu viele bitmaps auf einmal oder zu großen bitmaps, ohne Aufruf .recyceln, obwohl.
EDIT: Es ist wichtig zu beachten, dass ab Android 3.0, Bitmaps werden nicht mehr zugewiesen, der im systemeigenen Speicher. Die sind aufgeteilt auf die VM-heap-wie jedes andere Java-Objekt. Jedoch, was ich sagte etwa nicht aufrufen müssen recycle immer noch gilt.
InformationsquelleAutor der Antwort Victor