Qu’est ce qui détermine la taille de l’object Java?

Qu’est-ce qui consortingbue à la taille d’un seul object en mémoire?

Je sais que les primitives et les références le feraient, mais y a-t-il autre chose? Le nombre de méthodes et leur longueur importent-elles?

Ajouter un peu de données (certes vagues) à l’excellente réponse de @templatetypedef. Ces numéros sont destinés aux JVM 32 bits récentes, mais ils sont spécifiques à l’implémentation :

  • La surcharge d’en-tête pour chaque object correspond généralement à 2 mots pour un object régulier et à 3 mots pour un tableau. L’en-tête inclut les indicateurs associés au GC, et une sorte de pointeur sur la classe réelle de l’object. Pour un tableau, un mot supplémentaire est nécessaire pour contenir la taille du tableau.

  • Si vous avez appelé (directement ou indirectement) System.identityHashCode() sur un object et qu’il a survécu à un cycle GC, ajoutez un mot supplémentaire pour stocker la valeur du hachage. (Les JVM modernes utilisent une astuce astucieuse pour éviter de réserver un champ d’en-tête de hashcode pour tous les objects …)

  • La granularité d’allocation de stockage peut être un multiple de mots; par exemple 2.

  • Les champs d’un object sont généralement alignés sur des mots; c’est à dire qu’ils ne sont pas emballés.

  • Les éléments d’un tableau d’un type primitif sont compressés, mais les booléens sont généralement représentés par un octet sous forme condensée.

  • Les références occupent 4 octets à la fois comme champs et comme éléments de tableau.

Les choses sont un peu plus compliquées pour les JVM 64 bits en raison de la compression du pointeur (OOPS) dans certaines JVM. De plus, je ne suis pas sûr que les champs 32 ou 64 bits soient alignés.


(Remarque: ce qui précède est basé sur ce que j’ai entendu / lu à différents endroits de différentes “personnes bien informées”. Il n’y a pas de source définitive pour ce type d’informations à part Oracle / Sun, et (AFAIK) elles n’ont pas été publiées n’importe quoi.)

Découvrez java.sizeOf dans sourceforge ici: http://sizeof.sourceforge.net/

AFAIK, dans le code source de HBase, il y a une certaine caculation sur la taille de l’object basée sur certaines règles connues communes sur la manière dont les différents champs occupent les espaces. Et ce sera différent en 32 bits ou en 64 bits. Au moins au-dessus des gens tous savent. Mais je n’ai pas cherché dans les détails pourquoi ils le font. Mais ils l’ont vraiment fait dans le code source.

De plus, la classe Java.lang.intrument.Intrumentation peut le faire aussi par getObjectSize (). Je suppose que le projet open source est également basé sur celui-ci. Dans ce lien, il y a des détails sur la façon de l’utiliser. En Java, quelle est la meilleure façon de déterminer la taille d’un object?

Comme un commentaire. En fait, si le code source vous intéresse, quel sera le cas d’utilisation le plus significatif?