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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top