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?