Ho passato 4 giorni interi a provare tutto il possibile per capire la perdita di memoria in un'app che sto sviluppando, ma le cose hanno smesso di avere senso molto tempo fa.
L'app che sto sviluppando è di natura sociale, quindi pensa alle attività del profilo (P) ed elenca le attività con i dati, ad esempio i badge (B). Puoi passare da un profilo a un elenco di badge ad altri profili, ad altri elenchi, ecc.
Quindi immagina un flusso come questo P1 -> B1 -> P2 -> B2 -> P3 -> B3, ecc. Per coerenza, sto caricando profili e badge dello stesso utente, quindi ogni pagina P è la stessa e così è ogni pagina B.
L'essenza generale del problema è: dopo aver navigato per un po ', a seconda delle dimensioni di ogni pagina, ottengo un'eccezione di memoria esaurita in luoghi casuali - Bitmap, Stringhe, ecc. - Non sembra essere coerente.
Dopo aver fatto tutto quanto immaginabile per capire perché sto esaurendo la memoria, non ho trovato nulla. Quello che non capisco è perché Android non sta uccidendo P1, B1, ecc.Se esaurisce la memoria al caricamento e invece si blocca. Mi aspetterei che queste attività precedenti morissero e fossero resuscitate se mai tornassi a loro tramite onCreate () e onRestoreInstanceState ().
Per non parlare di questo - anche se faccio P1 -> B1 -> Back -> B1 -> Back -> B1, ottengo comunque un crash. Questo indica una sorta di perdita di memoria, ma anche dopo aver scaricato hprof e usando MAT e JProfiler, non riesco a individuarlo.
Ho disabilitato il caricamento delle immagini dal web (e aumentato i dati di prova caricati per compensare e rendere equo il test) e mi sono assicurato che la cache delle immagini utilizzi SoftReferences. Android in realtà cerca di liberare i pochi SoftReferences che ha, ma subito prima che la memoria si blocchi.
Le pagine dei badge ottengono i dati dal Web, li caricano in un array di EntityData da un BaseAdapter e li alimentano a un ListView (in realtà sto usando l' eccellente MergeAdapter di CommonsWare , ma in questa attività Badge c'è comunque solo 1 adattatore, ma io volevo menzionare questo fatto in entrambi i casi).
Ho esaminato il codice e non sono riuscito a trovare nulla che potesse trapelare. Ho cancellato e annullato tutto ciò che potevo trovare e persino System.gc () a sinistra ea destra, ma l'app si blocca ancora.
Ancora non capisco perché le attività inattive che sono in pila non vengono raccolte e mi piacerebbe davvero capirlo.
A questo punto, sto cercando suggerimenti, consigli, soluzioni ... tutto ciò che potrebbe aiutare.
Grazie.
outOfMemory
errore. Grazie!