2011-06-21 12 views
6

Estoy instrumentando la VM Dalvik y me gustaría saber si hay alguna herramienta para analizar la recolección de basura en dalvik. Sé sobre el rastreador de asignación, pero estoy buscando algo más elaborado.Herramienta de recolección de basura para dalvik

+0

Creo que DDMS te ayudará. –

+0

¿Qué problema estás tratando de resolver? –

+0

Estoy ejecutando un servicio en segundo plano en mi dispositivo que olfatea el tráfico web y actúa como un proxy para otras aplicaciones web en el dispositivo. Mi problema es que el recolector de basura toma mucho más tiempo que la ejecución normal. Esto hace que el servicio en segundo plano se bloquee, lo que a su vez conduce a una respuesta web lenta para la aplicación. Estoy tratando de ver este comportamiento abrupto del recolector de basura. – 22kar

Respuesta

0

Obtener un registro de todas las operaciones de GC con el tiempo:

Cada vez que un GC se lleva a cabo, se obtiene una línea en su LogCat.

08-08 16:42:21.998: D/dalvikvm(26942): GC_CONCURRENT freed 773K, 26% free 4739K/6368K, paused 4ms+3ms, total 92ms 
08-08 16:42:21.998: D/dalvikvm(26942): WAIT_FOR_CONCURRENT_GC blocked 11ms 

Parece que estoy obteniendo esos para todas las aplicaciones en mi dispositivo.

Esta línea incluye muchas estadísticas interesantes sobre el GC como la cantidad de memoria liberada, cuánto tiempo tomó el GC, cuándo sucedió exactamente y el tamaño del montón (usado/total).

Dado que todas esas líneas de registro tienen la etiqueta dalvikvm, debería ser capaz de recolectarlas y filtrarlas durante un período prolongado y analizarlas para conocer el comportamiento del GC.

Analizando una carrera específica de la GC:

Si desea analizar lo que sucede en una operación específica GC, la mejor herramienta para el trabajo es Eclipse MAT. Eclipse MAT puede analizar volcados de pila. Realice una instantánea de almacenamiento dinámico, espere el GC (o actívelo con DDMS) y luego tome otra instantánea.

Eclipse MAT puede mostrarle el delta entre las dos instantáneas. Observe que verá nuevas asignaciones y desasignaciones causadas por GC. Más información sobre cómo comparar instantáneas es available here.

Algunos otros pensamientos:

no estoy seguro de cuánto sería capaz de aprender de análisis del proceso de GC. El funcionamiento interno del GC es un detalle de implementación. Puede cambiar sin previo aviso entre las versiones/dispositivos/configuraciones del sistema operativo.

Estoy tratando de pensar en formas de mejorar la latencia del GC que está experimentando .. Me parece que el GC por lo general se ejecuta cuando las condiciones de memoria son bajas. Esto probablemente ocurra durante nuevas asignaciones, por lo tanto, el GC podría estar ejecutándose mientras su servicio esté activo. Quizás, si usa el tiempo que su servicio está inactivo para GC manualmente, podría reducir el número de GC que ocurren en la ruta crítica de responder a una solicitud web. Para probar eso, agregaría un temporizador de fondo simple y lo restablecería cada vez que mi servicio se active (solicitud nueva). Cuando el temporizador marque (inactividad por algún período de tiempo), ejecutaría System.gc() manualmente.