The playground

More information here

perdite di Memoria in Android – identificare, trattare ed evitare

Johan Olsson Seguire Apr 13, 2016 · 9 min leggere Nel nostro esercizio quotidiano di costruire applicazioni migliori, noi, come gli sviluppatori hanno bisogno di prendere in considerazione molte cose, al fine di rimanere in pista, uno dei quali è quello di assicurarsi che le nostre applicazioni non in crash. Una causa comune di crash […]
Johan Olsson
Johan Olsson

Seguire

Apr 13, 2016 · 9 min leggere

Nel nostro esercizio quotidiano di costruire applicazioni migliori, noi, come gli sviluppatori hanno bisogno di prendere in considerazione molte cose, al fine di rimanere in pista, uno dei quali è quello di assicurarsi che le nostre applicazioni non in crash. Una causa comune di crash sono perdite di memoria. Questo particolare problema può manifestarsi in varie forme. Nella maggior parte dei casi vediamo un costante aumento dell’utilizzo della memoria fino a quando l’app non può allocare più risorse e inevitabilmente si blocca. In Java questo spesso si traduce in un OutOfMemoryException essere gettato. In alcuni rari casi, le classi trapelate possono persino rimanere in giro abbastanza a lungo da ricevere callback registrati, causando alcuni bug davvero strani e troppo spesso lanciando la famigerata IllegalStateException.

Per aiutare gli altri a ridurre al minimo il tempo dedicato all’analisi del codice, presenterò alcuni esempi di perdite di memoria, come identificarli in Android Studio e, soprattutto, come rimuoverli.

Disclaimer

Lo scopo di questo post e dei suoi esempi di codice è quello di promuovere una comprensione più profonda della gestione della memoria, specialmente in Java. L’architettura generale, la gestione dei thread e la gestione delle richieste HTTP in esecuzione mostrate non sono ideali per un ambiente di produzione e servono semplicemente come portatore del punto fatto: le perdite di memoria in Android sono una cosa da considerare.

Registrazione degli ascoltatori

Questo non dovrebbe essere un problema, ma troppo spesso vedo chiamate a vari metodi di registro ma le loro controparti non registrate non si vedono da nessuna parte. Questa è una potenziale fonte di perdite, poiché questi metodi sono chiaramente progettati per essere bilanciati l’uno dall’altro. Senza chiamare il metodo unregister, l’istanza probabilmente manterrà un riferimento molto tempo dopo che l’oggetto di riferimento è stato terminato e inizierà quindi a perdere memoria. In Android questo è particolarmente fastidioso se quell’oggetto è un’attività, poiché spesso contiene una grande quantità di dati. Lascia che ti mostri come potrebbe essere.

In questo esempio lasciamo che il LocationManager Android ci informi sugli aggiornamenti della posizione. Tutto ciò di cui abbiamo bisogno per impostare questo è il servizio di sistema stesso e una richiamata per ricevere gli aggiornamenti. Qui implementiamo l’interfaccia di localizzazione nell’attività stessa, il che significa che LocationManager manterrà un riferimento alla nostra attività. Ora, se il dispositivo dovesse essere ruotato, verrà creata una nuova attività sostituendo quella vecchia già registrata per gli aggiornamenti della posizione. Poiché un servizio di sistema sopravviverà sicuramente a qualsiasi attività, LocationManager manterrà comunque un riferimento all’attività precedente, rendendo impossibile per il garbage collector recuperare le risorse ancora legate a quella particolare attività, con conseguente perdita di memoria. La rotazione ripetuta del dispositivo causerà quindi attività non recuperabili per riempire la memoria, portando infine a un’OutOfMemoryException.

Ma per risolvere una perdita di memoria, dobbiamo prima essere in grado di trovarlo. Fortunatamente Android Studio ha uno strumento integrato chiamato Android Monitor che possiamo usare per osservare l’utilizzo della memoria tra le altre cose. Tutto quello che dobbiamo fare è aprire il monitor Android e andare alla scheda Monitor per vedere quanta memoria viene utilizzata e allocata in tempo reale.

Android Monitor in Android Studio 2.0

Tutte le interazioni che causano l’allocazione delle risorse si rifletteranno qui, rendendolo un luogo ideale per tenere traccia dell’utilizzo delle risorse dell’applicazione. Per trovare la perdita di memoria, dobbiamo sapere cosa contiene la memoria in un momento in cui sospettiamo che la memoria sia trapelata. Per questo particolare esempio, tutto ciò che dobbiamo fare è avviare la nostra applicazione, ruotare il dispositivo una volta e quindi richiamare l’azione Dump Java Heap (accanto alla memoria, la terza icona da sinistra). Questo genererà un file hprof, che contiene un’istantanea di memoria al momento in cui abbiamo richiamato l’azione. Dopo un paio di secondi, Android Studio apre automaticamente il file, dandoci una rappresentazione visiva ordinata della memoria per una facile analisi.

Non entrerò in profondità su come navigare nell’enorme heap di memoria. Invece indirizzerò la vostra attenzione alle attività dell’analizzatore nell’angolo in alto a destra dello screenshot qui sotto. Tutto quello che devi fare per rilevare la perdita di memoria introdotta nell’esempio sopra è controllare Rilevare le attività trapelate e quindi premere play per far apparire l’attività trapelata sotto i risultati dell’analisi.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.