Non si può "cancellare il cumulo". la VM lo farà automaticamente quando i tuoi oggetti non saranno più referenziati.
Detto questo, le bitmap sono una cosa difficile in Android. C'è una memoria limitata e quando un'immagine viene decodificata in una bitmap può occupare molto più memoria rispetto al formato di immagine compressa stesso.
Non esiste una risposta semplice alla soluzione. Anche se fai tutto correttamente, potresti semplicemente rimanere senza memoria. Detto questo, ecco alcuni suggerimenti:
Utilizzare Bitmap.release()
. le bitmap sono speciali in quanto allocate nell'heap dello stack nativo (al contrario della VM). I javadoc sono un po 'confusi, affermando che normalmente non è necessario chiamare questo, ma nella mia esperienza questo "indizio" della VM che hai fatto con la memoria che supporta la bitmap è importante. MODIFICA: A partire da Android 3.0 (livello API 11), i dati dei pixel vengono memorizzati nell'heap Dalvik insieme alla bitmap associata.
Carica bitmap nella memoria ridimensionato. Ecco un blog post sull'argomento. Si ottengono solo 24 MB di heap su alcuni dispositivi e un'immagine ad alta risoluzione potrebbe esaurire tutto ciò quando viene caricata in un oggetto bitmap. Non c'è modo di aggirare questo, quindi devi caricarlo in scala.
Non chiamare System.gc()
come ha detto un'altra risposta. Le persone che hanno sviluppato l'algoritmo GC sono più intelligenti di te e me; loro sanno quello che stanno facendo. Non otterrai mai un OOME quando c'è una memoria che può essere liberata attraverso un GC - il GC funzionerà sempre prima di darti un OOME.
Questo suo ovvio, ma assicurarsi che non state tenendo riferimenti a immagini bitmap quando non sono necessari più.
Infine, e questo fa schifo, Android non fa mucchio compattazione. Ecco un SO question pubblicato su di esso qualche tempo fa, senza una risposta soddisfacente. In poche parole, Android non compatta mai l'heap, così come la tua app continua a allocare pezzi grandi o anche di medie dimensioni per bitmap, finisci per ritrovarti in una situazione in cui, mentre non hai memoria, non c'è abbastanza contigua pezzo di memoria per la tua allocazione, e ottieni OOME. Il modo solo, come ho scritto nella mia domanda, è quello di uccidere il processo della app quando l'utente si chiude. Ciò rende l'avvio più lento la volta successiva, ma garantisce un nuovo heap. Non fraintendermi, non posso credere che sia la cosa giusta da fare, ma nessuno ha trovato una soluzione migliore.
fonte
2012-03-21 05:30:25
È possibile leggere le ricerche su ciò che romain ha detto sulla grafica e sulle bitmap. – JoxTraex