2011-10-05 28 views
6

Collego il mio telefono Android ad eclissi. E vedo questi messaggi da Logcat. Puoi dirmi, per favore, qual è la differenza tra "GC_EXPLICIT" e "GC_EXTERNAL_ALLOC"? e cosa significa "45% gratis"?Garbage collection in dalvik vm

10-05 12:08:34.450: DEBUG/dalvikvm(813): GC_EXTERNAL_ALLOC freed 63K, 45% free 3156K/5703K, external 4113K/4348K, paused 73ms 
10-05 12:08:34.480: DEBUG/dalvikvm(101): GC_EXTERNAL_ALLOC freed 55K, 40% free 5883K/9799K, external 4911K/4913K, paused 124ms 
10-05 12:08:37.120: DEBUG/dalvikvm(101): GC_EXPLICIT freed 84K, 41% free 5870K/9799K, external 5745K/6078K, paused 104ms 
10-05 12:08:40.099: DEBUG/dalvikvm(493): GC_EXPLICIT freed 14K, 48% free 3782K/7175K, external 1625K/2137K, paused 75ms 
10-05 12:08:45.110: DEBUG/dalvikvm(188): GC_EXPLICIT freed 57K, 54% free 3203K/6855K, external 4988K/6206K, paused 78ms 
10-05 12:09:05.119: DEBUG/dalvikvm(822): GC_EXPLICIT freed 349K, 46% free 3696K/6727K, external 1625K/2137K, paused 65ms 

risposta

9

Consiglio vivamente dando la presentazione video di gestione della memoria da parte di Google I/O 2011 un orologio:

http://www.youtube.com/watch?v=_CruQY55HOk

A circa 14 minuti, lui va in alla profondità sulla esattamente ciò che questi significa nell'output logcat.

GC Esplicitamente significa che un'app ha chiamato in modo esplicito System.gc();

GC Concorrente viene attivato quando il tuo heap inizia a riempirsi e un GC Concurrent inizia a cancellare la memoria prima che si riempia.

1

GC_EXPLICIT significa la vostra applicazione è esplicitamente chiamato System.gc() o la Manger attività di sistema Android chiamato System.gc()

GC_EXTERNAL_ALLOC è qualcosa di più complicato. Ci sono alcuni ricordi relativi alla durata dell'oggetto Java chiamato EXTERNAL. Ad esempio l'utilizzo della memoria da parte delle risorse GPU o pixmap della tua app. Questo tipo di allocazione di memoria utilizza "malloc" di stdlib per allocare memoria heap ma NON per allocare dal GC Heap di Dalvik, ma è anche una delle memoria "HEAP". E l'utilizzo delle dimensioni totali del HEAP deve essere inferiore a un limite (decidere per GC).

Assegnazione del tracciamento Dalvik di quella memoria.

CONDITION: usableof(GC_HEAP) + usableof(NATIVE_HEAP[external]) <= allocaionLimit 

Dalvik causerà un GC per GC_EXTERNAL_ALLOC come effetto collaterale quando la condizione di cui sopra non è vero.