Java Language Consommation de mémoire des primitives vs primitives en boîte


Exemple

Primitif Type en boîte Taille de la mémoire de la primitive / en boîte
booléen Booléen 1 octet / 16 octets
octet Octet 1 octet / 16 octets
court Court 2 octets / 16 octets
carboniser Carboniser 2 octets / 16 octets
int Entier 4 octets / 16 octets
longue Longue 8 octets / 16 octets
flotte Flotte 4 octets / 16 octets
double Double 8 octets / 16 octets

Les objets en boîte nécessitent toujours 8 octets pour la gestion des types et de la mémoire, et comme la taille des objets est toujours un multiple de 8, les types en boîte nécessitent un total de 16 octets . En outre , chaque utilisation d'un objet en boîte implique le stockage d'une référence qui représente 4 ou 8 octets supplémentaires , en fonction des options de la machine virtuelle Java et de la machine virtuelle Java.

Dans les opérations gourmandes en données, la consommation de mémoire peut avoir un impact majeur sur les performances. La consommation de mémoire augmente encore plus lorsque vous utilisez des tableaux: un tableau float[5] ne nécessite que 32 octets; alors qu'un Float[5] stockant 5 valeurs non nulles distinctes nécessitera un total de 112 octets (sur 64 bits sans pointeurs compressés, cela augmente à 152 octets).

Caches de valeur en boîte

Les frais généraux d'espace des types encadrés peuvent être atténués dans une certaine mesure par les caches de valeur encadrés. Certains types encadrés implémentent un cache d'instances. Par exemple, par défaut, la classe Integer mettra en cache les instances pour représenter des nombres compris entre -128 et +127 . Cela ne réduit cependant pas le coût supplémentaire lié à l'indirection supplémentaire de la mémoire.

Si vous créez une instance d'un type en boîte soit par la mise en file d'attente automatique, soit en appelant la méthode statique valueOf(primitive) , le système d'exécution tente d'utiliser une valeur mise en cache. Si votre application utilise beaucoup de valeurs dans la plage mise en cache, cela peut réduire considérablement la pénalité de mémoire liée à l'utilisation de types encadrés. Certes, si vous créez des instances de valeurs encadrées "à la main", il vaut mieux utiliser valueOf plutôt que new . (La new opération crée toujours une nouvelle instance.) Si, toutefois, la majorité de vos valeurs ne se trouvent pas dans la plage mise en cache, il peut être plus rapide d'appeler new et d'enregistrer la recherche de cache.