Maison >Java >javaDidacticiel >Une analyse approfondie de la gestion de la mémoire dans les machines virtuelles Java
Cet article vous apporte une analyse approfondie de la gestion de la mémoire dans les machines virtuelles Java. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Zone de méthode
Pile de machines virtuelles (VM Stack)
Native Method Stack (Native Method Stack) Heap)
Compteur de programme S'inscrire
est une comparaison Le petit espace mémoire peut être considéré comme un indicateur de numéro de ligne du bytecode exécuté par le thread actuel. (L'interpréteur de bytecode fonctionne en modifiant la valeur de ce compteur pour sélectionner les instructions de bytecode qui doivent être exécutées).
Pile de machines virtuelles Java
La pile de machines virtuelles Java est également privée de thread et a le même cycle de vie que le thread.
La pile de machine virtuelle décrit le modèle de mémoire d'exécution : lorsque chaque méthode est exécutée, un cadre de pile est créé pour stocker les tables de variables locales, les piles d'opérandes, les liens dynamiques, les sorties de méthode et d'autres informations. Le processus depuis l'appel jusqu'à la fin de l'exécution de chaque méthode correspond au processus de poussée d'un cadre de pile dans la pile et de sortie de la pile dans la machine virtuelle.
La table de variables locales stocke divers types de données de base connus au moment de la compilation, les références d'objet et les types returnAddress (pointant vers l'adresse d'une instruction de bytecode).
Parmi eux, les données de type long et double occuperont deux espaces de variables locales (Slots), et les autres types de données n'en occuperont qu'un.
L'espace mémoire requis par la table de variables locales est alloué au moment de la compilation. Lors de la saisie d'une méthode, la quantité d'espace scalaire local que la méthode doit allouer dans le cadre est entièrement déterminée et ne changera pas au cours de la compilation. exécution de la méthode. La taille de la table des variables locales.
La spécification de la machine virtuelle stipule deux conditions d'exception pour cette zone : si la profondeur de pile demandée par le thread est supérieure à la profondeur autorisée par la machine virtuelle, une exception StackOverflowError sera levée si la pile de machine virtuelle le peut ; être étendu dynamiquement, si l'expansion Lorsque la mémoire insuffisante ne peut pas être demandée, une exception OutOfMemoryError sera levée.
Pile de méthodes locales
Le rôle de la pile de machines virtuelles est très similaire. La pile de méthodes locales sert les méthodes natives utilisées par la machine virtuelle. Il n'y a pas de règles obligatoires sur le langage, l'utilisation et les structures de données dans les méthodes natives.
Java Heap
Le tas est une zone mémoire partagée par tous les threads et est créée au démarrage de la machine virtuelle. Le seul but de cette zone mémoire est de contenir des instances d'objet, et presque toutes les instances d'objet se voient allouer de la mémoire ici (toutes les instances d'objet et tous les tableaux).
Du point de vue de l'allocation de mémoire, le tas Java partagé par les threads peut être divisé en plusieurs tampons d'allocation privés par thread (Thread Local Allocation Buffer, TLAB).
Le tas Java peut gérer un espace mémoire physiquement discontinu, à condition qu'il soit logiquement continu. Une fois implémentée, elle peut être implémentée sous forme de taille fixe ou évolutive, mais les machines virtuelles traditionnelles sont implémentées de manière évolutive (contrôle -Xms, -Xmx).
Zone de méthode
Comme le tas Java, il s'agit d'une zone mémoire partagée par chaque thread. Elle est utilisée pour stocker les informations de classe, les constantes, les variables statiques et le compilateur juste à temps compilé. informations qui ont été chargées par le code de la machine virtuelle et d’autres données. Bien que la machine virtuelle Java décrit la zone de méthode comme une partie logique du tas, elle possède un alias appelé Non-Heap pour la distinguer du tas Java.
En plus de ne pas nécessiter de mémoire contiguë comme le tas Java et d'avoir l'option de taille fixe ou d'extensibilité, vous pouvez également choisir de ne pas implémenter le garbage collection. La collecte des déchets a rarement lieu dans cette zone, mais elle n'existe pas de manière permanente comme la génération éternelle après être entrée dans la zone des méthodes. Le recyclage de la mémoire dans ce domaine vise principalement à recycler les types de pool constant et de déchargement. Le
fait partie de la zone méthode. En plus de la version de la classe, des champs, des méthodes, des interfaces et d'autres informations, le fichier de classe contient des informations. Une autre information est la table de pool de constantes, qui est utilisée pour divers littéraux et références de symboles générés lors de la compilation. Ce contenu sera stocké dans le pool de constantes d'exécution dans la zone de méthode après le chargement de la classe.
C'est dynamique. Seul le contenu du pool de constantes préinstallé dans le fichier Class peut entrer dans le pool de constantes d'exécution dans la zone méthode. De nouvelles constantes peuvent également être mises dans le pool pendant l'exécution. Developers. est le intern() de la classe String.
Lorsque la machine virtuelle reçoit une nouvelle instruction, elle vérifie d'abord si les paramètres de cette instruction peuvent être localisés dans le pool constant. Une référence symbolique à une classe et vérifie si la classe représentée par cette référence symbolique a été chargée, résolue et initialisée. Sinon, le processus de chargement de classe correspondant doit être effectué en premier.
Allouer de la mémoire pour les nouveaux objets après la vérification du chargement de la classe. La quantité de mémoire requise par un objet est entièrement déterminée une fois la classe chargée.
Une fois l'allocation de mémoire terminée, l'espace mémoire que la machine virtuelle doit être allouée est initialisé à zéro. Si TLAB est utilisé, ce travail peut être effectué à l'avance lorsque TLAB est alloué.
Ensuite, la machine virtuelle effectue les réglages nécessaires pour l'objet, tels que la classe dont 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 et d'autres informations. Ces informations sont placées dans l'en-tête de l'objet.
Après avoir terminé l'étape précédente, la tâche pour la machine virtuelle est terminée, mais du point de vue du programme Java, la création d'objets vient de commencer et
La disposition de la mémoire des objets en mémoire peut être divisée en 3 parties : l'en-tête de l'objet, les données d'instance et le remplissage d'alignement.
L'en-tête d'objet de la machine virtuelle HotSpot se compose de deux parties :
1. Stocke les données d'exécution de l'objet lui-même, telles que le hachage, l'âge de génération GC, l'indicateur d'état de verrouillage et le thread. verrouillage de maintien, ID de fil biaisé, horodatage biaisé, etc. La longueur des données dans les machines virtuelles 32 bits et 64 bits est respectivement de 32 bits et 64 bits, ce qui est officiellement appelé « Marquer le mot ».
2. Tapez le pointeur, qui est le pointeur des métadonnées de classe de l'objet. La machine virtuelle utilise ce pointeur pour déterminer de quelle classe l'objet est une instance. Si l'objet est un tableau Java, il doit y avoir une donnée dans l'en-tête de l'objet pour enregistrer la longueur du tableau, car la machine virtuelle peut déterminer la taille de l'objet Java via les métadonnées des objets Java ordinaires, mais elle ne le peut pas. déterminez-le à partir des métadonnées du tableau. La taille du tableau.
Les données de référence sur la pile de programmes Java peuvent accéder aux instances d'objets dans le tas via les deux méthodes principales suivantes.
Handle : Un morceau de mémoire sera alloué dans le tas Java pour être utilisé comme handle. La référence stocke l'adresse du handle de cet objet. Le handle contient les propriétés spécifiques des données d’instance d’objet et des données de type.
Pointeur direct : dans la disposition des objets de tas Java, vous devez réfléchir à la manière d'empêcher l'accès aux informations relatives aux données de type.
Recommandations associées :
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!