2013-04-22 10 views
8

Quando eseguo la mia applicazione sull'emulatore del Logcat sta mostrando questo:Attendere GC concorrente bloccato

04-22 16:21:30.685: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 78ms+17ms, total 360ms 

04-22 16:21:30.685: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 143ms 
04-22 16:21:31.845: D/dalvikvm(967): GC_CONCURRENT freed 1552K, 20% free 7019K/8720K, paused 116ms+18ms, total 554ms 

04-22 16:21:31.845: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 268ms 
04-22 16:21:32.435: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 75ms+9ms, total 192ms 

04-22 16:21:32.435: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 73ms 
04-22 16:21:32.945: D/dalvikvm(967): GC_CONCURRENT freed 1552K, 20% free 7019K/8720K, paused 75ms+10ms, total 209ms 

04-22 16:21:32.945: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 70ms 
04-22 16:21:33.434: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 78ms+12ms, total 192ms 

e questo continua fino a quando esco il suggerimento application.Any Grazie

risposta

2

questo significa che stai facendo? troppe operazioni e molta memoria è in uso. Quindi, GC (Garbage Collector) viene chiamato per liberare memoria.

04-22 16: 21: 30,685: D/dalvikvm (967): GC_CONCURRENT liberato 1545K, 20% libera 7019K/8720K, 78ms + 17ms, 360ms totale pausa

liberato indica come è stata liberata molta memoria

GC_CONCURRENT Richiamato quando lo heap diventa troppo grande per impedire l'overflow.

in pausa 78 ms + 17 ms: indica il tempo necessario al GC per completare la raccolta.

Refer

Inoltre prendono dump della memoria e analizzare lo strumento discarica uso MAT.

6

Sembra che stiate creando molti nuovi oggetti e li buttiate via presto.

Per WAIT_FOR_CONCURRENT_GC vedere questo: what does WAIT_FOR_CONCURRENT_GC blocked mean?

Significa si tenta di allocare la memoria (ad esempio per la creazione di oggetti) e non si adatta in memoria. Questo è ciò che GC_CONCURRENT liberato è causato da. La sua solita raccolta dei rifiuti.

Se si verificano problemi di prestazioni, provare a riutilizzare gli oggetti o a risparmiarli.

1

D'accordo soprattutto con @luxer, ma credo che non si stia assegnando troppi oggetti, ma si stanno allocando alcuni oggetti enormi. Se fai riferimento al link puntato da @luxer su WAIT_FOR_CONCURRENT_GC, ti renderai conto che un secondo gc viene attivato nella tua app mentre un gc concorrente (che in genere viene attivato quando l'occupazione dell'heap raggiunge un limite flessibile) è in corso. Il secondo gc potrebbe essere stato attivato da te esplicitamente o perché un'allocazione non è riuscita. Dato che non hai indicato che stai chiamando System.gc(), suppongo che le tue allocazioni stiano fallendo e che il sistema stia cercando di fare un gc.

Quindi, si, si dovrebbe seriamente considerare di riutilizzare alcuni oggetti enormi invece di assegnarli ogni volta. Questa è una pratica migliore, ma se per qualche motivo non si è in grado di farlo, è probabile che si possa aumentare la dimensione dell'heap (impostando un heap di grandi dimensioni) e ciò potrebbe aiutare.

2

A volte capita quando si ha un ciclo infinito solo perché alcune condizioni sono sempre vere.

Cerca di capire se questo caso è il primo, perché succede soprattutto per questo.