studio programacion móviles libros desarrollo desarrollar curso con aprende aplicaciones java android dalvik

java - móviles - manual de programacion android pdf



Android y Dalvik-Obtén el tamaño de un objeto (4)

Mi idea de obtener el tamaño de un ArrayList<String> en el montón fue serializar el objeto en un Byte-Array, donde la longitud es el tamaño.

He usado el SerializationUtils de Apache Commons Lang .

Para serializar:

byte[] data = SerializationUtils.serialize((Serializable) arrayList);

La longitud de la matriz de datos debe ser aproximadamente del tamaño en bytes en el montón.

Como se mencionó, esto requiere la biblioteca de Commons Lang. Se puede importar utilizando Gradle:

api ''org.apache.commons:commons-lang3:3.5''

más maneras mencionadas here

Como todos sabemos, Java 5 introdujo la capacidad de Instrumentation para obtener el tamaño de un objeto con facilidad. ¿Existe tal método en Android y Dalvik?

El paquete java.lang.instrument no está disponible en Android.


Para este problema, es mejor no usar un enfoque programático, sino usar la Herramienta de análisis de memoria (MAT) de www.eclipse.org/mat/ Tiene una versión independiente y un complemento para Eclipse. Con él puede crear una instantánea del montón de Dalvik y luego puede 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 una fuga de caché de mapa de bits.


Para 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 verlo usted mismo, el tamaño de un objeto se almacena en ClassObject::objectSize : size_t , vea dalvik / vm / oo / Object.h .

Sin embargo, hay API internas para obtener el tamaño de un objeto. Es utilizado por DDMS para reportar información detallada sobre tamaños de objetos. Pero, dado que la API es interna, es probable que cambie entre diferentes versiones de Android. Además, la API envía datos en byte[] procesar byte[] , y está basada en el cliente / servidor y no es una simple llamada de biblioteca, por lo que será extremadamente incómoda 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 y fácilmente utilizable para obtener el tamaño de un objeto en la máquina virtual de Dalvik.


int length =processes.size();

Te devuelve el tamaño del objeto.