Tutoriel de base de JavaLa colonne présente le processus de création d'objets par JVM, d'accès et de positionnement
Recommandations d'apprentissage gratuites associées : Tutoriel Java Basics
1. Création d'objets
- Lorsque la machine virtuelle reçoit la nouvelle instruction, elle vérifie si cette instruction peut localiser un symbole de classe dans la référence du pool constant et vérifie si la classe représentée par cette référence symbolique a été chargée, résolue et initialisée. S'il n'y en a pas, effectuez d'abord le processus de chargement de classe.
- Une fois le chargement de la classe réussi, la machine virtuelle alloue de la mémoire pour le nouvel objet (en divisant une mémoire d'une certaine taille du tas Java). La taille de la mémoire peut être complètement déterminée une fois le chargement de la classe terminé.
- Deux méthodes d'allocation :
- (1) : Collision de pointeur : Supposons que la mémoire dans le tas Java est absolument régulière, c'est-à-dire que la mémoire utilisée est d'un côté, la mémoire libre est de l'autre côté, et le pointeur du milieu A est placé comme indicateur, et l'allocation de mémoire est obtenue en déplaçant le pointeur.
- (2) : Liste libre : Si la mémoire dans le tas Java n'est pas régulière, c'est-à-dire que la mémoire utilisée et la mémoire libre sont entrelacées, la machine virtuelle doit maintenir une liste pour enregistrer les blocs de mémoire disponibles, alloue de la mémoire en recherchant de l'espace dans la liste à allouer aux instances d'objet.
- Le fait que le tas Java soit régulier ou non est déterminé par le fait que le garbage collector utilisé ait une fonction de compactage.
- Créer un objet dans une machine virtuelle n'est pas un comportement thread-safe. Il peut arriver que lorsque l'objet A se voit allouer de la mémoire, le pointeur n'ait pas eu le temps d'être modifié et que l'objet B utilise le pointeur d'origine pour le faire. allouer de la mémoire. Il existe deux solutions :
- (1) : Synchroniser l'action d'allocation d'espace mémoire. En fait, la machine virtuelle utilise CAS avec tentative d'échec pour garantir l'atomicité de l'opération de mise à jour ; 2) : L'action d'allocation de mémoire est divisée en différents espaces selon les threads, c'est-à-dire que chaque thread pré-alloue un petit morceau de mémoire dans le tas Java, appelé tampon d'allocation de thread local (Thread Loal Allocation Buffer, TLAB) .
- Une fois l'allocation de mémoire terminée, tous les espaces mémoire alloués doivent être initialisés à des valeurs nulles pour garantir que les champs d'instance de l'objet peuvent être utilisés directement dans le code Java sans attribuer de valeurs initiales, et le programme peut accéder à ces champs. La valeur zéro correspondant au type de données.
- Définissez l'objet, stockez de quelle classe l'objet est une instance, comment trouver les informations de métadonnées de la classe, le code de hachage de l'objet, l'âge de génération GC de l'objet, etc. dans l'objet en-tête.
- 2. Disposition de la mémoire des objets : La disposition des objets stockés en mémoire peut être divisée en trois parties : en-tête, données d'instance et remplissage. L'en-tête de l'objet comprend deux parties d'informations :
(1) : stocke les données d'exécution de l'objet lui-même, telles que le code de hachage, l'âge de génération du GC, l'indicateur d'état du verrouillage, le verrou détenu par le thread, et biais Thread ID, biais horodatage, etc. La longueur de cette partie des données est respectivement de 32 bits et 64 bits dans les machines virtuelles 32 bits et 64 bits. Elle est officiellement appelée Mark Word (une structure de données non fixe qui multiplexe la sienne). stockage selon l'état de l'objet).
(2) : Type de pointeur, c'est-à-dire un pointeur vers les métadonnées de classe de l'objet. La machine virtuelle utilise ce pointeur pour déterminer à quelle classe l'objet est une instance. de.
Données d'instance : les informations effectives réellement stockées par l'objet, c'est-à-dire le contenu des différents types de champs définis dans le code du programme. Qu'elle soit héritée de la classe parent ou définie par la sous-classe elle-même, elle doit être enregistrée.
- Remplissage d'alignement : il n'existe pas nécessairement et agit comme un espace réservé puisque HotSpot VM exige que la taille de l'objet soit un multiple entier de 8 octets et que la partie d'en-tête de l'objet soit exactement un multiple entier de. 8 octets. Par conséquent, lorsque les données d'instance ne sont pas alignées, elles sont complétées par un remplissage d'alignement.
- 3. Positionnement de l'accès aux objets : Java exploite des objets spécifiques sur le tas via des données de référence sur la pile (les références d'objet dans la table de variables locales spécifient uniquement les références aux objets, et ne définissent pas comment les localiser). et accéder à l'emplacement des objets dans le tas. La méthode d'accès aux objets est implémentée par Swift.
(1) : Accès au handle : Le tas Java divisera un morceau de mémoire en tant que pool de handles. La référence stocke l'adresse du handle de l'objet. Le handle contient les informations d'adresse de l'instance d'objet. données et tapez les données.
Avantages : La référence stocke une adresse de handle stable lorsque l'objet se déplace, seul le pointeur de données d'instance dans le handle change, pas la référence.
(2) : Pointeur direct : L'adresse de l'objet stockée dans la référence est directement l'adresse des données de type objet (stockées dans la zone méthode) placées dans le tas Java.
Avantages : Plus rapide, ce qui permet d'économiser le temps de positionnement du pointeur. HotSpot utilise un accès direct au pointeur.
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!