Selon JavaWorld
Une simple Object
prend 8 octets ;
La réponse est donc "non".
Remarque : En outre, le JDK 1.5 a ajouté la fonction un Instrumentation
interface qui comprend [a getObjectSize()
méthode .
Mindprod résume les différentes tailles, qui ne changent pas entre les systèmes d'exploitation de 32 et 64 bits, à l'exception de références aux objets . Certaines JVM à 64 bits peuvent compressé leurs références d'objets afin d'éviter les surcharges lorsqu'il est exécuté sur une plate-forme à 32 bits.
Une JVM est libre de stocker les données comme bon lui semble en interne, big ou little endian, avec n'importe quelle quantité de remplissage ou de surcharge, bien que les primitives doivent se comporter comme si elles avaient les tailles officielles.
Par exemple, la JVM ou le compilateur natif peuvent décider de stocker un fichier boolean[]
en morceaux de 64 bits comme un BitSet
. Il n'est pas obligé de vous le dire, tant que le programme donne les mêmes réponses.
- Il peut allouer des objets temporaires sur la pile.
- Il peut optimiser certaines variables ou appels de méthodes en les remplaçant par des constantes.
- Il pourrait versionner des méthodes ou des boucles, c'est-à-dire compiler deux versions d'une méthode, chacune optimisée pour une certaine situation, puis décider à l'avance laquelle appeler.
Ensuite, bien sûr, le matériel et le système d'exploitation ont des caches multicouches, un cache sur la puce, un cache SRAM, un cache DRAM, un ensemble de travail RAM ordinaire et un stockage de secours sur disque. Vos données peuvent être dupliquées à chaque niveau de cache. Toute cette complexité signifie que vous ne pouvez prédire que très approximativement la consommation de RAM.
Le site Article de JavaWorld donne un peu plus de détails sur la surcharge de stockage en fonction du conteneur utilisé :
Par exemple, les wrappers peuvent également être coûteux par rapport aux types primitifs pour les attributs :
Integer
: Le résultat de 16 octets est un peu moins bon que ce à quoi je m'attendais, car une valeur int peut tenir dans seulement 4 octets supplémentaires. L'utilisation d'un Integer me coûte un surcoût de mémoire de 300 % par rapport à la possibilité de stocker la valeur comme un type primitif.
Long
: 16 octets également : Il est clair que la taille réelle des objets sur le tas est sujette à un alignement mémoire de bas niveau effectué par une implémentation particulière de la JVM pour un type de CPU particulier. Il semble qu'un Long représente 8 octets de surcharge Object, plus 8 octets supplémentaires pour la valeur longue réelle. En revanche, Integer avait un trou de 4 octets inutilisé, très probablement parce que la JVM que j'utilise force l'alignement des objets sur une frontière de mot de 8 octets.
D'autres conteneurs sont également coûteux :
Tableaux multidimensionnels Il s'agit d'une autre surprise.
Les développeurs utilisent généralement des constructions telles que int[dim1][dim2]
dans le domaine du calcul numérique et scientifique.
Dans un int[dim1][dim2]
chaque exemple de tableau imbriqué int[dim2]
est un tableau Object
à part entière. Chacun d'eux ajoute la surcharge habituelle des tableaux de 16 octets. Lorsque je n'ai pas besoin d'un tableau triangulaire ou irrégulier, cela représente une surcharge pure. L'impact augmente lorsque les dimensions du tableau sont très différentes.
Par exemple, un int[128][2]
prend 3 600 octets. Comparé aux 1 040 octets d'une instance de int[256]
utilise (qui a la même capacité), 3 600 octets représentent une surcharge de 246 %. Dans le cas extrême de byte[256][1]
le facteur de surcharge est de presque 19 ! Comparez cela à la situation en C/C++, où la même syntaxe n'ajoute aucune surcharge de stockage.
String
: a String
La croissance de la mémoire de l'entreprise suit la croissance de son tableau interne de chars. Cependant, le String
ajoute 24 octets supplémentaires de surcharge.
Pour une chaîne de caractères non vide de 10 caractères ou moins, les frais généraux supplémentaires par rapport à la charge utile (2 octets pour chaque caractère plus 4 octets pour la longueur) vont de 100 à 400 %.