java - memories - ¿Cuánta memoria usa una Hashtable?
jvm memories (2)
Editar; Oh, vaya, soy un idiota, di información para HashMap, no HashTable. Sin embargo, después de verificar, las implementaciones son idénticas para propósitos de memoria.
Esto depende de la configuración de la memoria interna de su máquina virtual (empaque de elementos, punteros de 32 o 64 bits y alineación / tamaño de palabra) y java no lo especifica.
La información básica sobre la estimación del uso de la memoria se puede encontrar 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 sobrecarga pequeña y constante para cada hashmap: un flotador, 3 ints, más sobrecarga de objetos.
- Hay una serie de máquinas tragamonedas, algunas de las cuales tendrán entradas, algunas de las cuales estarán reservadas para las nuevas. La proporción de ranuras llenas a ranuras totales NO ES MÁS QUE el factor de carga especificado en el constructor.
- El conjunto de ranuras requiere una sobrecarga de objetos, más un int para el tamaño, más un puntero por cada ranura, para indicar el objeto almacenado.
- El número de ranuras generalmente es de 1.3 a 2 veces más 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 hash.
- Cada asignación almacenada requiere un objeto de entrada. Esto requiere una sobrecarga de objetos, 3 punteros, más la clave almacenada y los objetos de valor, más un número entero.
Entonces, uniéndolo (para Sun HotSpot JVM 32/64): HashMap necesita 24 bytes (en sí mismo, campos primitivos) + 12 bytes (constante de matriz de ranura) + 4 u 8 bytes por ranura + 24/40 bytes por entrada + clave tamaño de objeto + valor de tamaño de objeto + relleno de cada objeto en múltiplos de 8 bytes
O, aproximadamente (como máximo, configuración predeterminada, no garantizada para ser precisa):
- En JVM de 32 bits: 36 bytes + 32 bytes / mapeo + claves y valores
- En JVM de 64 bits: 36 bytes + 56 bytes / mapeo + claves y valores
Nota: esto necesita más control, puede necesitar 12 bytes para la sobrecarga de objetos en la máquina virtual de 64 bits. No estoy seguro acerca de los nulos: los punteros para nulos pueden comprimirse de alguna manera.
En Java, si creo una Hashtable<K, V>
y pongo N elementos en ella, ¿cuánta memoria ocupará? Si depende de la implementación, ¿cuál sería una buena "suposición"?
Es difícil de estimar. Leería esto primero: 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.