Question

En Java, si je crée un Hashtable<K, V> et y mets N éléments, quelle quantité de mémoire occupera-t-il? Si cela dépend de la mise en œuvre, quel serait un bon & "Deviner &";

Était-ce utile?

La solution

Modifier; Oh bon sang, je suis un idiot, j'ai donné des informations pour HashMap, pas HashTable. Cependant, après vérification, les implémentations sont identiques pour des raisons de mémoire.

Cela dépend de la configuration de la mémoire interne de votre machine virtuelle (emballage des éléments, pointeurs 32 bits ou 64 bits et alignement / taille des mots) et n'est pas spécifié par java.

Des informations de base sur l'estimation de l'utilisation de la mémoire sont disponibles ici .

Vous pouvez l'estimer comme suit:

  • Sur les ordinateurs virtuels 32 bits, le pointeur correspond à 4 octets, tandis que sur les ordinateurs virtuels 64 bits, il représente 8 octets.
  • La surcharge de l'objet correspond à 8 octets de mémoire (pour un objet vide ne contenant rien)
  • La taille des objets est multipliée par un multiple de 8 octets (ugh).
  • Il existe une surcharge légère et constante pour chaque hashmap: un float, 3 ints, plus la charge d'un objet.
  • Il existe un tableau d'emplacements, dont certains comportent des entrées, d'autres réservées aux nouveaux. Le rapport entre les emplacements remplis et le nombre total d'emplacements ne dépasse pas le facteur de charge spécifié dans le constructeur.
  • Le tableau de slots nécessite un overhead d’objet, un int pour la taille, et un pointeur pour chaque slot, pour indiquer l’objet stocké.
  • Le nombre d'emplacements est généralement 1,3 à 2 fois supérieur au nombre de mappages enregistrés, avec un facteur de charge par défaut de 0,75, mais peut être inférieur, en fonction des collisions de hachage.
  • Chaque mappage stocké nécessite un objet d'entrée. Cela nécessite une surcharge d’objet, 3 pointeurs, plus les objets clé et valeur stockés, ainsi qu’un entier.

Donc, assemblage (pour JVM Sun HotSpot 32/64 bits): HashMap a besoin de 24 octets (lui-même, champs primitifs) + 12 octets (constante de groupe d’emplacements) + 4 ou 8 octets par emplacement + 24/40 octets par entrée + taille d’objet clé + valeur taille d’objet + remplissage de chaque objet en multiple de 8 octets

OU, à peu près (avec la plupart des paramètres par défaut, il n'est pas garanti d'être précis):

  • Sur la JVM 32 bits: 36 octets + 32 octets / mappage + touches & amp; valeurs
  • Sur les machines virtuelles Java 64 bits: 36 octets + 56 octets / mappage + touches & amp; valeurs

Remarque: cela nécessite davantage de vérification, 12 octets peuvent être nécessaires pour la surcharge d’objet sur une machine virtuelle 64 bits. Je ne suis pas sûr des nulls - les pointeurs pour les nulls peuvent être compressés d'une manière ou d'une autre.

Autres conseils

C'est difficile à estimer. Je voudrais lire ceci en premier: http://www.codeinstructions.com/2008/12/ java-objects-memory-structure.html

Utilisez simplement les outils sunjdk pour déterminer la taille de K, V et

jmap -histo [pid]

num #instances #bytes nom de classe

1: 126170 19671768 MyKClass

2: 126170 14392544 MyVClass

3: 1 200000 MyHashtable

Vous pouvez également utiliser HashMap au lieu de Hashtable si vous n'avez pas besoin de synchronisation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top