2010-10-21 27 views
11

Estoy trabajando en el cálculo del tamaño [memoria utilizada] de un objeto java [hashmap]. Contiene elementos de diferentes tipos de datos [en tiempo de ejecución] por lo que [no-de-elem * tamaño-de-elemento] no es un buen enfoque. El código en este momento lo hace por series deCálculo del tamaño de bytes del objeto Java

if (x) 
    do something 
else if (primitives) 
    lookup size and calculate 

Sin embargo, este proceso es una CPU hog e in-efficient.

Pienso en siguiente lugar 2 enfoques:

  1. serializar el objeto a un búfer y obtener el tamaño.
  2. Mira en java.lang.instrument para obtener el tamaño

Busco anyones experiencia con estos enfoques para el rendimiento, la eficiencia, la ampliación etc o si conoce alguna forma mejor.

P.S: Esta es una utilidad de fondo que estoy construyendo, por lo que no es necesario que el tamaño sea muy preciso, aunque debería ser lo correcto. Así que estoy dispuesto a exactitud comercio para un rendimiento

No estoy interesado en el tamaño de profundidad [el tamaño de los objetos que se refirió por este objeto no será computada.]

Busco a comparaciones de rendimiento y la comprensión de cómo getObjectSize() trabaja internamente .so que no messup algo más para mejorar el rendimiento

Gracias

+0

¿Qué * exactamente * quieres decir con el tamaño? Cantidad de memoria ocupada? Cantidad de elementos contenidos? –

+0

por tamaño, me refiero a la cantidad de memoria tomada ... edición para reflejar que – codeObserver

+1

Pregunta más o menos idéntica: http://stackoverflow.com/questions/757300/programatically-calculate-memory-occupied-by-a-java- object-including-objects-it-r – andersoj

Respuesta

4

uso getObjectSize() método del paquete de instrumentación.

Look here para detalles de implementación:

+0

thnx .. Estoy buscando una comparación de rendimiento y entender cómo getObjectSize() funciona internamente ... así que no estropeo algo más para mejorar el rendimiento // aunque creo que getObjectSize es mi Mejor opción. – codeObserver

2

El tamaño serializado no es definitivamente el camino a seguir, por dos razones:

  • En la serialización de Java estándar no puede ser todo un montón de gastos generales, que haría agregar al tamaño.
  • No sería más rápido que usar el método getObjectSize(), que podemos suponer iterará sobre todas las referencias, y usar algún tipo de búsqueda para determinar el tamaño de los valores/referencias primitivos de un objeto.

Si necesita un mejor rendimiento, eso dependerá de la distribución de sus objetos. Una posibilidad sería hacer un muestreo aleatorio de los valores en su mapa, determinar un promedio y calcular un estimado a partir de este valor.

Para obtener consejos sobre cómo buscar un valor aleatorio en un hashmap, consulte este question.

+0

Thnx ... El muestreo aleatorio puede ser muy impreciso, ya que el valor en el mapa hash puede variar en gran medida. – codeObserver

2

Puede que le interese un artículo que escribí hace un tiempo en how to calculate the memory usage of a Java object. Es cierto que está dirigido principalmente a Hotspot de 32 bits, aunque gran parte se aplica en esencia a otros entornos.

También puede descargar un simple agent for measuring Java object size del mismo sitio que le costará parte del duro trabajo y debería funcionar en entornos de 64 bits.

Tenga en cuenta que, como otros, he mencionado que la forma serializada de un objeto no es la misma que su forma en la memoria, por lo que utilizar la serialización no es adecuado si desea medir la huella de memoria con precisión.

Cuestiones relacionadas