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, la prémisse de l'utilisation de la mémoire tas dont nous parlons est basée sur le contexte de « situations générales ». À l'exclusion des deux situations suivantes :
Dans certains cas, la JVM ne met 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 taille de la mémoire occupée par l'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 se compose de quatre champs (A, B, C et D), expliquons-les un par un ci-dessous :
A : En-tête de l'objet, occupant très peu d'octets, exprimant des informations sur l'état actuel de l'objet
B : Espace occupé par les champs de type de base (les champs natifs font référence to int , boolean, short, etc.)
C : L'espace occupé par le champ type référence (le champ type référence fait référence à la référence d'autres objets, chaque référence occupe 4 octets)
D : L'espace occupé par le filler (ce qui sera expliqué plus tard C'est du filler)
Expliquons A, B, C et D un à un
A : En-tête de l'objet
En mémoire, l'espace total occupé par chaque objet inclut non seulement la déclaration dans l'objet. L'espace requis par la variable comprend également des informations supplémentaires, telles que l'en-tête et le remplissage de l'objet. 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 occupe 8 octets
Un tableau occupe 12 octets, y compris les octets ordinaires objets 8 octets 4 octets (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 : Filler
Dans Hotspot, l'espace total occupé par chaque objet est un multiple de 8 Calculé, lorsque l'espace total occupé par l'objet (variables déclarées dans l'entête de l'objet) est inférieur à un multiple de 8, il sera renseigné automatiquement. Cependant, ces espaces remplis peuvent être appelés « remplisseurs ». Regardons un exemple précis :
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 uniquement une variable de type booléen occupe 16 octets - -> En-tête d'objet (8 octets) booléen (1 octets) Filler (7 octets)
déclare une classe avec 8 variables de type booléen, occupant 16 octets --> octets) ) * 8
Grâce aux exemples ci-dessus, cela nous aidera à approfondir notre compréhension de la programmation Java.
Pour plus d'articles sur la façon de calculer le nombre d'octets occupés par un objet Java, veuillez faire attention au site Web PHP chinois !