2012-01-25 25 views
18

Como todos sabemos, Java 5 introdujo la capacidad de Instrumentación de obtener el tamaño de un objeto con facilidad. ¿Hay tal método en Android y Dalvik? El paquete java.lang.instrument no está disponible en Android.Android y Dalvik: obtenga el tamaño de un objeto

+0

Mira esto: http://www.javapractices.com/topic/TopicAction.do?Id=83 – slayton

+0

Se ve y se siente como un hack crummy ... Fui con la respuesta de Samuel. –

+0

Simplemente curioso ... ¿cuál es su caso de uso real para necesitar eso? –

Respuesta

12

Por lo que vale, he mirado el código fuente de Dalvik VM y no puedo encontrar ninguna API estable para obtener el tamaño de un Objeto. Si desea echar un vistazo, el tamaño de un objeto se almacena en ClassObject::objectSize : size_t, consulte dalvik/vm/oo/Object.h.

Sin embargo, interno API para obtener el tamaño de un objeto. DDMS lo utiliza para informar información detallada sobre el tamaño de los objetos. Pero, dado que la API es interna, es probable que cambie entre las diferentes versiones de Android. Además, la API envía datos crudos byte[], y está basado en el cliente/servidor y no es una simple llamada a la biblioteca, por lo que será extremadamente incómodo de usar. Si desea echar un vistazo, comience en dvmAllocObject() en dalvik/vm/alloc/Alloc.cpp y la llamada dvmTrackAllocation().

Para resumir: desafortunadamente no hay ninguna API estable que se pueda utilizar para obtener el tamaño de un objeto en la VM Dalvik.

+0

Hit the jackpot, dvmAllocObject es la función llamado cuando se usa un nuevo operador. En cuanto al tamaño, es una cosa verdadera, los usuarios de la aplicación pueden obtener el tamaño. –

0

Para este problema, es mejor no utilizar un enfoque programático sino utilizar la herramienta Memory Analyzer (MAT) desde www.eclipse.org/mat/ Tiene una versión independiente y un complemento para Eclipse. Con él puedes crear una instantánea del montón de Dalvik y luego puedes ordenar la lista de objetos por su tamaño o también por el tamaño de sus objetos referenciados (tamaño retenido). Utilicé esto exactamente para solucionar problemas de fugas de caché de mapa de bits.

+0

Está buscando una manera de calcular el tamaño de un objeto ** en tiempo de ejecución **. –

+1

La solución que propuse funciona exactamente en tiempo de ejecución. – WindRider

-7
int length =processes.size(); 

le devuelve el tamaño del objeto.

+1

¿Qué tipo es ** procesos **? Esto no parece muy útil en absoluto. –

+1

No respondiendo a la pregunta anterior – milosmns

+1

Supongo que está pensando que los procesos son una ArrayList o algo así. –

Cuestiones relacionadas