L'exemple de cet article décrit comment calculer (ou estimer) la quantité de mémoire occupée par un objet Java. Partagez-le avec tout le monde pour votre référence. L’analyse spécifique est la suivante :
Habituellement, nous parlons d’utilisation de la mémoire tas dans le contexte de « cas généraux ». Les deux situations suivantes ne sont pas incluses :
Dans certains cas, la JVM ne place pas du tout l'objet dans le tas. Par exemple : en principe, un petit objet local de thread existe sur la pile, pas dans le tas.
La quantité de mémoire occupée par un objet dépend de l'état actuel de l'objet. Par exemple : si le verrouillage de synchronisation de l'objet est en vigueur ou si l'objet est en cours de recyclage.
Voyons d’abord à quoi ressemble un seul objet dans le tas.
Dans le tas, chaque objet est constitué de quatre champs (A, B, C et D). Expliquons chacun ci-dessous :
A : En-tête d'objet, qui occupe très peu d'octets et exprime des informations sur l'état actuel de l'objet.
B : L'espace occupé par les champs de type de base (les champs natifs font référence à int, boolean, short, etc.)
C : L'espace occupé par les champs de type référence (les champs de type référence font référence à des références à d'autres objets, chaque référence occupe 4 octets)
D : Espace occupé par le remplissage (ce qu'est le remplissage sera expliqué plus tard)
Ci-dessous, nous expliquons A, B, C et D un par un
A : En-tête de l'objet
En mémoire, l'espace total occupé par chaque objet inclut non seulement l'espace requis pour les variables déclarées dans l'objet, mais inclut également des informations supplémentaires, telles que les en-têtes et les remplissages des objets. La fonction de "l'en-tête de l'objet" est d'enregistrer le nom de l'instance, l'ID et l'état de l'instance d'un objet (par exemple, si l'instance actuelle est "accessible", ou l'état du verrou actuel, etc.).
Dans la version actuelle de la JVM (Hotspot), le nombre d'octets occupés par "l'en-tête de l'objet" est le suivant :
Un objet ordinaire, occupant 8 octets
Tableau, occupe 12 octets, dont 8 octets + 4 octets d'objets ordinaires (longueur du tableau)
B : type de base
boolean et byte occupent 1 octet, char et short occupent 2 octets, int et float occupent 4 octets, long et double occupent 8 octets
C : type de référence
Chaque type de référence occupe 4 octets
D : remplisseur
Dans Hotspot, l'espace total occupé par chaque objet est calculé comme un multiple de 8. Lorsque l'espace total occupé par l'objet (en-tête de l'objet + variables déclarées) est inférieur à un multiple de 8, il sera automatiquement renseigné. Cependant, ces espaces remplis peuvent être appelés « remplisseurs ». Regardons un exemple spécifique :
Un objet vide (sans aucune variable déclarée) occupe 8 octets --> l'en-tête de l'objet occupe 8 octets
Une classe qui déclare une seule variable de type booléen occupe 16 octets --> en-tête d'objet (8 octets) + booléen (1 octets) + remplissage (7 octets)
Une classe qui déclare 8 variables de type booléen occupe 16 octets --> en-tête d'objet (8 octets) + booléen (1 octets) * 8
Les exemples ci-dessus nous aideront à approfondir notre compréhension de la programmation Java.