Comme nous le savons tous, Java est un langage orienté objet, alors que contient un objet en mémoire Tout d'abord, La plupart des objets le sont ? Stocké sur le tas (sauf pour l'évasion ).
Ensuite, le stockage des objets dans le tas est principalement divisé en trois parties
En-tête d'objet, instance d'objet data , Supplément d'alignement (le tableau aura une longueur de tableau supplémentaire)
Object header:
# 🎜🎜#marquer le mot : Stocke le hashCode de l'objet, les informations de verrouillage (mise à niveau du verrouillage) ou des informations telles que l'âge de la génération ou le drapeau GC
Pointeur de type : # 🎜🎜# Stocke un pointeur vers la classe à laquelle appartient l'objet (fichier de classe dans métadonnées ), à travers lequel la JVM détermine à quelle classe appartient l'objet #🎜 🎜#
#🎜 🎜#Données d'instance d'objet :Les informations d'objet générées par new stockent les informations de données d'attribut de la classe, y compris les informations d'attribut de la classe parent ;
Supplément d'alignementL'objet tableau sera multi-aligné et rempli #🎜 🎜#La JVM exige que l'espace occupé par l'objet soit de 8. Les multiples facilitent l'allocation de mémoire (allocation en octets comme unité minimale), cette partie est donc utilisée pour remplir l'espace insuffisant pour constituer le nombre.
Positionnement d'accès aux objets Java
handle :
#🎜🎜 #Un morceau de mémoire est divisé en tas Java en tant que pool de handles. La référence dans la pile stocke l'adresse du handle de l'objet, et le handle contient les informations d'adresse spécifiques des données d'instance d'objet et des données de typePointeur direct:
La disposition de la mémoire des objets dans le tas Java doit prendre en compte la manière d'empêcher l'accès aux données de type liées informations. Le pointeur direct stocké dans la référence est l’adresse de l’objet.
L'accès direct du pointeur à l'objet ne nécessite pas de surcharge d'accès indirect supplémentaire, et le handle est pratique lorsque l'adresse de l'objet change (le garbage collection déplacera l'adresse de l'objet) et doit seulement être modifié dans le handle. La référence du pointeur elle-même n'a pas besoin d'être modifiée.
Le processus de création d'objets Java
Lorsque la machine virtuelle rencontre la nouvelle instruction, elle vérifie d'abord la classe spécifiée Si
est chargé, vérifié, préparéAprès la vérification de classe, la machine virtuelle alloue de la mémoire pour les nouveaux objetsComment garantir la sécurité de l'allocation de mémoire du tas dans des situations simultanées# 🎜🎜# La machine virtuelle utilise CAS avec des tentatives d'échec pour garantir l'atomicité pour allouer de la mémoire aux threads, allouer de l'espace lors de la création des threads et laisser la tâche d'allouer de la mémoire aux threads. Ouvrez TLAB (Thread local Allocation Buffer)
Après avoir alloué la mémoire, définissez l'en-tête de l'objet, tel que l'instance de classe, le hashcode, le pointeur d'informations sur les métadonnées de classe (zone de méthode)
Exécutez la méthode init (méthode du noyau), initialisez les variables membres, exécutez le bloc de code d'instanciation, appelez le constructeur de la classe et mettez le tas La première adresse de l'objet est affecté à la variable de référence.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!