Pregunta

En Java, si creo un Hashtable<K, V> y ponerle N elementos, ¿cuánta memoria ocupará?Si depende de la implementación, ¿cuál sería una buena "suposición"?

¿Fue útil?

Solución

Editar; Oh cielos, soy un idiota, di información para HashMap, no para HashTable. Sin embargo, después de verificar, las implementaciones son idénticas para fines de memoria.

Esto depende de la configuración de la memoria interna de su VM (paquete de elementos, punteros de 32 bits o 64 bits, y alineación / tamaño de palabras) y java no lo especifica.

Puede encontrar información básica sobre la estimación del uso de la memoria aquí .

Puedes estimarlo así:

  • En máquinas virtuales de 32 bits, un puntero es de 4 bytes, en máquinas virtuales de 64 bits, es de 8 bytes.
  • La sobrecarga del objeto es de 8 bytes de memoria (para un objeto vacío, que no contiene nada)
  • Los objetos se rellenan a un tamaño que es un múltiplo de 8 bytes (ugh).
  • Hay una pequeña sobrecarga constante para cada hashmap: una flotante, 3 pulgadas, más sobrecarga de objeto.
  • Hay una serie de ranuras, algunas de las cuales tendrán entradas, algunas de las cuales estarán reservadas para otras nuevas. La relación de ranuras llenas a ranuras totales NO ES MÁS QUE el factor de carga especificado en el constructor.
  • La matriz de ranuras requiere una sobrecarga de objeto, más un int para el tamaño, más un puntero para cada ranura, para indicar el objeto almacenado.
  • El número de ranuras es generalmente de 1.3 a 2 veces mayor que el número de asignaciones almacenadas, con un factor de carga predeterminado de 0.75, pero puede ser menor que esto, dependiendo de las colisiones de hash.
  • Cada mapeo almacenado requiere un objeto de entrada. Esto requiere una sobrecarga de un objeto, 3 punteros, más la clave almacenada y los objetos de valor, más un número entero.

Entonces, uniéndolo (para JVM Sun HotSpot de 32/64 bits): HashMap necesita 24 bytes (en sí, campos primitivos) + 12 bytes (constante de matriz de ranuras) + 4 u 8 bytes por ranura + 24/40 bytes por entrada + tamaño de objeto clave + tamaño de objeto de valor + relleno de cada objeto a múltiplo de 8 bytes

O, aproximadamente (en la mayoría de las configuraciones predeterminadas, no se garantiza que sea precisa):

  • En JVM de 32 bits: 36 bytes + 32 bytes / asignación + teclas & amp; valores
  • En JVM de 64 bits: 36 bytes + 56 bytes / asignación + teclas & amp; valores

Nota: esto necesita más comprobación, puede necesitar 12 bytes para la sobrecarga de objetos en una máquina virtual de 64 bits. No estoy seguro acerca de los nulos: los punteros para nulos pueden estar comprimidos de alguna manera.

Otros consejos

Es difícil de estimar. Primero leería esto: http://www.codeinstructions.com/2008/12/ java-objects-memory-structure.html

Simplemente use las herramientas sunjdk para calcular el tamaño de K, V y

jmap -histo [pid]

num #instances #bytes class name

1: 126170 19671768 MyKClass

2: 126170 14392544 MyVClass

3: 1 200000 MyHashtable

También es posible que desee utilizar HashMap en lugar de Hashtable si no necesita sincronización.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top