2012-04-29 15 views
6

Hice algunos benchmarks que comparaban el rendimiento de int vs Integer, long vs Long, instancia de clase vacía vs instancia de clase con valor largo.28 bytes para instancia de objeto/clase vacía?

Y tengo algunas preguntas que no puedo contestar a mí mismo:

  1. razón por la creación de instancias de la clase vacía o un objeto lleva 28 bytes?
  2. creación de instancias de objeto largo toma 29 bytes, 8 bytes primitivos, entonces ¿por qué la diferencia a la clase vacía es de solo 1 byte? ¿Qué tipo de optimización está haciendo JVM?

que utilizan JDK1.6.0_30 en MacOS, y el código está disponible en https://github.com/mousator/benchmarks/blob/master/src/sk/emandem/michal/AutoboxingTypeBenchmark.java (usted puede pagar todo el proyecto)

Gracias por las respuestas!

Respuesta

2
  1. No confío en su técnica de medición de la memoria. Simplemente llamando al runtime.gc() no necesariamente hace nada. Use una herramienta como MemoryMeasurer.
  2. Las matrices incurren en una sobrecarga propia: típicamente del orden de 12 bytes; ocho para el encabezado del objeto y cuatro para la longitud de la matriz, y luego cuatro bytes por entrada de la matriz para una referencia. (Eso es en máquinas virtuales de 32 bits).
+0

Gracias por la respuesta @Louis. Probé MemoryMeasurer, para la clase vacía obtengo 20 bytes, por lo que 4 bytes como puntero de matriz y 16 por ejemplo (aunque 16 un poco raro). Sin embargo, el método de tiempo de ejecución es interesante ya que produce mediciones bastante estables: repetición iterativa de la secuencia "invocar GC, medir memoria, código de llamada, medir memoria, invocar GC" obteniendo los mismos valores. La única diferencia en las mediciones entre el uso del tiempo de ejecución y MemoryMeasurer es en clase vacía y envoltura int (ambas 25B frente a 20B) – mousator

+0

Presioné enter ... Entonces la pregunta seguida es, ¿puedo estimar OOME usando 20 o 25B? – mousator

+0

Uh. Yo no dependería de eso. Mucho más simple solo para probarlo y ver. –

Cuestiones relacionadas