Descripción de los mensajes de Android GC
Tengo el siguiente mensaje en mi catlog,
GC_CONCURRENT freed 456K, 19% free 2753K/3360K, paused 5ms+9ms, total 378ms
Estoy tratando de dar sentido al total del último valor. He comprobado otros GC relacionados con la pregunta en el sitio que o bien tienen dos pausas asociadas con el GC concurrente o una sola pausa total para el GC no concurrentes. ¿Por qué tengo dos? ¿Se detuvo mi aplicación durante 5 + 9 ms o 378 ms? ¿Qué es exactamente el total?
- Determinar cuándo se ejecuta el Android GC
- ¿Por qué se filtran hilos en Android?
- Android: ¿el GC no respeta SoftReferences?
- OnReceive Asynchronous Operations y recolección de basura
- Cómo explícitamente realizar la recolección de basura
- Gran cantidad de memoria no recogida de basura
- En una aplicación React Native JavaScript, ¿por qué cambiaría el comportamiento de Android GC si creaba una variable temporal en lugar de devolver un valor directamente?
- ¿Cómo inicia el Android Studio el Garbage Collector y cómo funciona?
- ¿Qué significan GC_FOR_MALLOC, GC_EXPLICIT y otros GC_ * en Android Logcat?
- Cómo escuchar eventos de GC en Android
- ¿Cómo solucionar GC_concurrent liberado?
- Consideraciones del GC de Android: ¿cuándo se ejecuta el GC y se puede rastrear su estado de ejecución desde el código?
- ¿Está creando lo siguiente para loop bad para Garbage Collection?
No tengo una respuesta definitiva, pero por lo que obtengo, GC_CONCURRENT es una colección de elementos no utilizados que se ejecuta en un subproceso separado. Esto significa que aunque puede tardar un total de X ms (378 en su caso) para ejecutarse, su hilo de ejecución real no se bloqueará durante tanto tiempo. Sólo se bloqueará un poco al principio y al final del proceso de recopilación simultánea de la basura (5 + 9 = 14ms en su ejemplo)
Este tipo de recolección de basura es activado automáticamente por la JVM cuando decide que es un buen momento para hacerlo (normalmente cuando el montón ha crecido peligrosamente alto). Otros tipos de GC, como GC_EXPLICIT (si no me equivoco en el nombre) se activa cuando se hace una
System.gc ();
en su código. Para este tipo de recolección de basura sólo informará una vez (como Y ms) y, en este caso, el hilo se bloqueará durante ese tiempo hasta que finalice este tipo de proceso GC.
GC_CONCURRENT
: Se activa cuando el montón está creciendo. Así que puede recuperar la memoria en el tiempo para que el montón no necesita ser ampliado
GC_CONCURRENT
liberado 456K
Esta parte le dice cuánta memoria fue liberada por este barrido GC
GC_CONCURRENT
liberado 456K, 19% libre 2753K / 3360K
Esta parte indica cuánto% de la pila está libre, el tamaño de los objetos vivos y el tamaño total de la pila. Así que en el ejemplo anterior el 19% libre, hay 2753Kmemory en uso y el tamaño de montón total es 3360K.
La última parte del registro le dice cuánto tiempo tomó la GC. en una colección GC_CONCURRENT
verá 2 veces. uno al principio de la colección y otro al final.
Para n
eventos de GC concurrentes, sólo hay un tiempo de pausa y normalmente es mucho mayor. Por ejemplo, pausó 378ms
Fuente:
https://sites.google.com/site/pyximanew/blog/androidunderstandingddmslogcatmemoryoutputmessages
Otro lugar donde las cosas se explican claramente …
De mirar algunos systraces que tomé parece que el total (378ms) no refleja cuánto tiempo el GC realmente hizo una pausa su aplicación. Refleja cuánto tiempo tomó la recolección de basura. El tiempo pausado es lo que debe buscar en eso.
Echa un vistazo a esta pregunta que explica los mensajes de recolección de basura, etc
Si necesita más información, vea este video de google acerca de la administración de memoria
http://www.youtube.com/watch?v=_CruQY55HOk .
Mire el video alrededor de 17 minutos. El chico explica el mensaje logcat en detalle.
GC_CONCURRENT freed 456K, 19% free 2753K/3360K, paused 5ms+9ms, total 378ms GC_CONCURRENT : Jumps in because Heap is growing 19% free 2753K/3360K After this collection 19% of memory is free. Check the heap usage.paused 5ms+9ms Time taken to collect garbage. Total pause time is 378ms.
- Android Studio no funciona bien con gradle 2.10 y gradle plugin 2.0.0-alpha5
- Interferencia multitáctil para Android