1. Présentation
La machine virtuelle Java divisera la mémoire qu'elle a gérée en plusieurs zones de données différentes dans le processus d'exécution du programme Java. La mémoire gérée par la machine virtuelle Java comprendra les zones de données d'exécution suivantes, comme indiqué dans la figure ci-dessous:
Ce qui suit est expliqué dans tous les domaines.
Deuxièmement, la zone de données <br /> compteur de programmes <br /> compteur de programmes peut être considérée comme un indicateur de numéro de ligne du code d'octet exécuté par le thread actuel. Dans le modèle de concept de la machine virtuelle, l'interprète de code de travail consiste à sélectionner les instructions de code d'octets qui doivent être exécutées en modifiant les valeurs du compteur de base. La récupération du thread et les autres fonctions de base doivent toutes être complétées sur ce compteur pour terminer.
En multiplié, pour permettre au thread de retourner à la position d'exécution correcte, chaque thread doit avoir un programmeur indépendant.
Lorsque le thread est exécuté est une méthode Java, ce compteur enregistre l'adresse de l'instruction de code d'octets de machine virtuelle qui est exécutée;
Cette zone de mémoire est le seul domaine qui ne spécifie aucune oreilleurror outofmory.
Pile de machine virtuelle Java
La pile de machines virtuelles Java est également privée et son cycle de vie est le même que les threads. La pile de machines virtuelles décrit le modèle de mémoire exécuté par la méthode Java: chaque méthode créera une trame de pile pour stocker des tables de variables locales, des piles de fonctionnement, des listes liées dynamiques, des informations d'exportation de méthode, etc. Du processus d'appel jusqu'à ce que le processus d'achèvement soit appelé, il correspond au processus de saisie de la pile dans une pile de machine virtuelle à la pile.
Dans le tableau des variables locales, divers types de données de base (booléens, octets, char, court, flotteur, long, double), les références d'objets et les types de returnAddress sont stockés dans le compilateur.
Si vous ne pouvez pas demander une mémoire suffisante pendant l'extension, l'exception OutOfMemoryError sera lancée.
La pile de méthode locale <br /> la pile de méthode locale est similaire à la machine virtuelle. . Certaines machines virtuelles combinent directement la pile de méthode locale et la pile de machines virtuelles en une seule.
Jetera StackOverflowerror et OutOfMemoryerror Anomalies.
Tas de java
La pile Java est une zone de mémoire partagée par tous les threads.
La pile Java est la zone principale de la gestion du collecteur des ordures. Étant donné que le collecteur est essentiellement utilisé pour la division des algorithmes de recyclage, la pile Java peut également être subdivisée comme: la nouvelle génération et la vieillesse. Du point de vue de la distribution de la mémoire, la pile Java partagée par le fil peut diviser plusieurs threads tampon distribué privé (TLAB).
La pile Java peut être dans un espace mémoire discontinu physique, tant qu'elle est logiquement continue. En termes de mise en œuvre, il peut non seulement obtenir une taille ou une extension fixe.
S'il n'y a pas d'allocation d'instance d'achèvement de la mémoire dans le tas et que la pile ne peut pas être terminée, l'OutofMemoryerror sera jeté.
Zone de méthode
La zone de méthode est une zone de mémoire partagée par divers threads.
Relativement parlant, les comportements de collecte des ordures sont rarement apparus dans ce domaine, mais il n'existe pas de façon permanente dans le domaine de la méthode des données.
Lorsque la zone de méthode ne peut pas répondre aux besoins de la distribution de la mémoire, l'OutofMemoryError sera jeté.
Pool constant en cours d'exécution:
Il fait partie de la zone de méthode, qui est utilisée pour stocker divers types et références de symboles générées par la période de compilation.
Mémoire directe
La mémoire directe ne fait pas partie de la zone de données lorsque la machine virtuelle est en cours d'exécution.
L'allocation directe de la mémoire ne sera pas limitée par la taille de la pile Java, mais elle sera limitée par la taille de la mémoire, et tout peut également lancer une exception OutOfMemoryRerror.
Troisièmement, le processus de création, de mise en page et d'accès des objets
Création d'objets
La création d'un objet nécessite généralement le nouveau mot-clé. Si le processus de chargement de classe correspondant est exécuté.
Une fois le cours chargé, la machine virtuelle alloue la mémoire aux nouveaux étudiants. La tâche d'attribution de l'espace à l'objet équivaut à diviser un morceau de mémoire déterminé par la taille de la pile Java. Il y a deux façons d'allouer: l'une est appelée collision de pointeur. Un autre nom est la liste vide: si la mémoire de la pile Java n'est pas régulière, la machine virtuelle doit maintenir une liste, qui enregistre quel bloc de mémoire est disponible. Instance d'objet. et mettez à jour les enregistrements de la liste. Quelle méthode de distribution est déterminée par si le tas de Java est régulé et si le tas Java est déterminé par si le collecteur de déchets est utilisé avec la compression et la fonction organisationnelle. Un autre problème qui doit être pris en compte est le problème de sécurité du thread lorsque l'objet crée. de la mémoire (TLAB) dans la pile Java.
Une fois la distribution de mémoire terminée, la machine virtuelle doit initialiser l'espace mémoire distribué à une valeur zéro. Cette étape garantit que le champ d'instance de l'objet peut être utilisé directement dans le code Java sans la valeur initiale.
Ensuite, la machine virtuelle doit définir les paramètres nécessaires, tels que la classe de cet objet est l'instance de la classe, comment trouver les informations de métadonnées de la classe, etc. Ces informations sont stockées dans la tête d'objet de l'objet.
Une fois le travail ci-dessus terminé, un nouvel objet a été généré dans la perspective de la machine virtuelle. Cependant, du point de vue du programme Java, la méthode INIT est également nécessaire pour initialiser l'objet en fonction des souhaits du programmeur.
Disposition de la mémoire de l'objet
Dans la machine virtuelle Hotspot, la disposition des objets en mémoire peut être divisée en trois parties: tête d'objet, données d'instance et remplissage d'alignement.
La tête d'objet comprend deux parties: la première partie est utilisée pour stocker les données de l'objet lui-même, comme le code de hachage, l'âge de vieillissement GC et les serrures détenues par les threads. Le fonctionnaire s'appelle "Mark Word". La deuxième partie est le pointeur de type, c'est-à-dire le pointeur de l'objet à ses données de métad de classe, et la machine virtuelle détermine quelle classe de cet objet est par ce pointeur.
Les données d'instance sont une information efficace stockée dans l'objet, et il s'agit également d'une variété de contenu sur le terrain défini dans le code du programme.
Le remplissage d'alignement n'existe pas nécessairement, joue simplement le rôle du personnage d'occupation. , Hotpot VM nécessite que l'adresse de départ de l'objet doit être un multiple entier de 8 octets. alignement.
Positionnement d'accès à l'objet
Le programme Java exploite l'objet spécifique de la pile via les données de référence sur la pile. Les principales méthodes d'accès sont deux types: poignée et pointeur direct:
Personnel: Java Tas dessinera un morceau de mémoire en tant que pool de poignée. Comme indiqué sur la figure:
Pointeur direct: La disposition de l'objet Java Pile devrait examiner comment placer les informations pertinentes des données de type du type d'accès, et l'adresse de l'objet est stockée dans la référence. Comme indiqué sur la figure:
Les deux méthodes ont leurs propres avantages. une dépense temporelle pour le positionnement du pointeur.
Ce qui précède est tout le contenu de cet article.