2011-04-02 15 views
8

Me gustaría probar cuántos bytes utiliza una referencia de objeto en la máquina virtual Java que estoy usando. ¿Ustedes saben cómo probar esto?¿Cómo probar cuántos bytes utiliza una referencia de objeto en Java?

Gracias!

+1

Sólo estoy adivinando aquí, pero ¿por qué no escribir un programa de 0 octetos asignados, que simplemente hace un bucle para establecer una línea de base, y asignar 100 000 (1 millón según sea necesario) objs del mismo tipo . La diferencia de tamaño (podría ser) una estimación razonable. Los gurús de Java son bienvenidos para actualizar esta idea ;-) – shellter

+0

@Shelter: Con un moderno O/S, JVM y GC, los resultados son probablemente demasiado granulares para ser útiles. –

+0

Las respuestas que has obtenido hasta ahora parecen ser sobre el tamaño del objeto. Sin embargo, su pregunta especifica el objeto _reference_ size. Si realmente está buscando el tamaño de referencia, consulte http://stackoverflow.com/questions/981073/how-big-is-an-object-reference-in-java-and-precisely-what-information-does-it- estafa – WhiteFang34

Respuesta

10

Tomando la pregunta literalmente, en la mayoría de las JVM, todas las referencias en las JVM de 32 bits tomar de 4 bytes, uno JVM de 64 bits, una referencia tarda 8 bytes a menos -XX: + UseCompressedOops se ha utilizado, en cuyo caso toma 4 bytes.

Supongo que está preguntando cómo saber cuánto espacio ocupa un objeto. Puedes usar Instrumentación (no es una cuestión simple) pero esto solo te dará una profundidad baja. Java tiende a dividir en muchos objetos algo que es C++ podría ser una estructura única, por lo que no es tan útil.

Sin embargo, si tiene un problema de memoria, le sugiero un generador de perfiles de memoria. Esto le dará el uso de objetos espaciales superficiales y profundos y le dará una imagen en todo el sistema. Esto a menudo es más útil, ya que puede comenzar con los mayores consumidores y optimizarlos, ya que incluso si ha estado desarrollando Java durante diez años + solo adivinará dónde es el mejor lugar para optimizar a menos que tenga datos.

Otra forma de obtener el tamaño del objeto si no desea utilizar un generador de perfiles es asignar un conjunto grande y ver cuánta memoria se consume. Debe hacerlo muchas veces para hacerse una idea de lo que el promedio el tamaño es. Establecería el espacio joven muy alto para evitar que los GCs confundan sus resultados, p. -XX:NewSize=1g

2

Se puede diferir de JVM para JVM pero "Sizeof for Java" dice

Es posible recordar "Java Tip 130:? ¿Usted conoce su tamaño de datos" que describía una técnica basada en la creación de un gran número de instancias de clase idénticas y midiendo cuidadosamente el aumento resultante en el tamaño de pila utilizado por JVM. Cuando corresponda, esta idea funciona muy bien, y de hecho la usaré para arrancar el enfoque alternativo en este artículo.

1

This one es el que yo uso. ¡Me encantan esas referencias de 16 bytes! alphaworks.ibm.heapanalyzer

Cuestiones relacionadas