Come analizzare il comportamento Dalvik GC?
-
13-10-2019 - |
Domanda
Sto sviluppando un'applicazione su Android. Si tratta di un'applicazione lunga corsa che elabora continuamente i dati del sensore. Durante l'esecuzione dell'applicazione vedo un sacco di messaggi GC nel logcat; circa un secondo.
Questo è molto probabilmente a causa di oggetti creati ed immediatamente de-referenziate in un ciclo.
Come faccio a sapere quali oggetti sono stati creati e rilasciati immediatamente?
Tutti gli strumenti di analisi del Java heap che ho provato (*) sono infastiditi con i conteggi e le dimensioni degli oggetti sul mucchio. Mentre sono utili, io sono più interessato a scoprire il luogo in cui temporaneo oggetti di breve durata ottenere creato la maggior parte.
(*) ho provato jcat
e Eclipse MAT
. Non ho potuto ottenere hat
a lavorare sul Android heap-discariche; si lamentava di una versione file di dump non supportato.
Soluzione
Come faccio a sapere quali oggetti sono stati creati e rilasciati immediatamente?
Passo # 1:. Temporaneamente modificare il codice (o creare un progetto di scarto con le porzioni rilevanti del codice), in cui è possibile fare clic su un pulsante o qualcosa per eseguire esattamente una volta attraverso la logica di elaborazione sensore
Passo # 2:. Get in DDMS (stand-alone o la prospettiva Eclipse)
Passo # 3: Scegli il tuo emulatore, quindi fare clic sulla scheda Assegnazione Tracker
Passo # 4:. Ottenere l'applicazione al punto in cui si è in attesa del pulsante di scatto dal punto # 1, quindi fare clic su Start allineamento utilizzando la scheda Tracker DDMS Allocazione
Passo # 4:. Fare clic sul pulsante, e quando il passaggio di trasformazione sensore è completo, fare clic su Assegnazioni sulla scheda Tracker DDMS Allocazione
Questo vi dirà che cosa è stato assegnato durante quella parte del codice. E non ti dice ciò che è "pubblica", perché questo è indeterminato fino a quando viene eseguito un ciclo di GC.
Modifica
Non sono certo, ma startAllocCounting()
sulla classe android.os.Debug
possono avere lo stesso effetto di quando si clicca sul pulsante Start di monitoraggio. Se è così, si potrebbe semplicemente strumento il codice per tenere traccia delle allocazioni più di un passaggio del ciclo, piuttosto che pasticciare con il codice cambia ho descritto sopra.
E, FWIW, ecco un breve articolo tecnico sulla DDMS e il monitoraggio di assegnazione.
Altri suggerimenti
Credo che è necessario dare allocazione inseguitore una prova:)
(in / strumenti dir)
http://developer.android.com/resources/articles/track- mem.html