Android & OutOfMemoryError: cause possibili oltre alla perdita di memoria?

1

Nella mia applicazione continuo a ricevere rapporti sugli arresti anomali in cui la causa principale è un errore OutOfMemoryError.

L'app è piuttosto pesante (utilizzo Picasso per tutto il caricamento dell'immagine) e ha anche un componente WebView che viene utilizzato per visualizzare tutti i tipi di contenuto da testo e immagini a video incorporati e GIF animate.

Ho usato Square's LeakCanary in alcuni punti ma non sono riuscito a trovare perdite consistenti. Con la mia comprensione dei runtime di Android che sono piuttosto incompleti, questo mi porta alla mia domanda principale:

Un OutOfMemory ha sempre bisogno di una perdita come causa principale o è possibile / probabile che si verifichi per altri motivi? Quali altri motivi sarebbe? Il garbage collector funziona non abbastanza velocemente? Semplicemente usando troppo spazio heap per (ad esempio) Bitmap? C'è qualcosa che può essere fatto su questi problemi?

EDIT: Per rendere più chiaro ciò che ho bisogno di sapere: sono abbastanza certo che nessuna singola allocazione che sto facendo superi lo spazio totale disponibile. È solo che occasionalmente mi sembra di avere troppo spazio esaurito in modo che qualche allocazione casuale dopo ciò fallisca; almeno gli arresti sono in realtà abbastanza rari e non facilmente riproducibili. È che un segno ragionevolmente certo di una perdita precedente o è ancora possibile che io abbia solo "troppo in corso" in una volta e non c'è davvero niente che il GC potrebbe aver liberato per fare funzionare l'attuale allocazione ? END EDIT

Se pensi che dovrei continuare a cercare perdite di memoria: oltre a Activity s, che LeakCanary traccia automaticamente quali sono i posti migliori in cui cercare le perdite?

    
posta david.mihola 01.07.2015 - 10:04
fonte

1 risposta

3

Sebbene compressi per l'archiviazione, le immagini possono occupare molto più spazio internamente mentre vengono mappate nella memoria del display. Combina questo con l'ampia variazione delle capacità del dispositivo tra i dispositivi Android, ed è probabile che tu abbia raggiunto i limiti di memoria dei dispositivi meno capaci.

Se possibile, puoi provare a tenere traccia delle immagini che non si trovano attualmente nell'area dello schermo visibile e scaricarle. Li ricaricheresti quando necessario mentre vengono visualizzati nella vista (o avvicinandoti). La WebView può o meno fare questo per te.

    
risposta data 01.07.2015 - 13:41
fonte

Leggi altre domande sui tag