Le contenu de cet article est une introduction (images et texte) sur le cadre de pile de la machine virtuelle Java. Il a une certaine valeur de référence. J'espère que les amis dans le besoin pourront s'y référer. utile pour vous.
Ce que j'ai écrit auparavant : La machine virtuelle Java est une science et un chef-d'œuvre de nombreux maîtres Java. En raison de mon niveau personnel limité et de mon énergie limitée, je ne peux pas garantir que tout est correct. Le contenu ici est après un examen attentif. , une partie du contenu est citée de l'œuvre originale, qui est déjà très bonne, donc je ne le répéterai pas. Bien entendu, il est impossible d’analyser ici tous les détails en profondeur. Nous ne parlons que de quelques concepts plus importants. En raison du manque de compréhension approfondie des principes de composition informatique, la plupart d’entre eux ne peuvent être analysés qu’à l’aide de la théorie de la boîte noire.
Structure du cadre de pile d'exécution (qu'est-ce qu'un cadre de pile ?)
Le cadre de pile est la structure de données utilisée par la machine virtuelle pour effectuer des appels et exécuter des méthodes. , frame de pile En fait, il s'agit de l'élément de pile de la pile de machines virtuelles de la zone de données d'exécution JVM (JVM Stack). L'exécution et l'appel de chaque méthode correspondent à un cadre de pile. Pour donner un exemple simple, définissez une pile et placez des objets appelés cadres de pile dans cette Statck. Cet objet contient table de variables locales, pile d'opérandes, lien dynamique et adresse de retour de méthode et d'autres attributs. Parlons ensuite de la structure de l’objet stack frame.
Tout d'abord, vous devez comprendre que la chaîne d'appel d'une méthode dans un thread peut être très longue, et de nombreuses méthodes sont à l'état d'exécution. Pour notre moteur d'exécution, seule il y en a une. le haut de la pile.Le cadre de pile est valide.C'est ce qu'on appelle le cadre de pile actuel (Concurrent Satck Frame). La méthode liée à ce cadre de pile est appelée la méthode actuelle (Concurrent Method) . comme suit :
À travers le modèle conceptuel du stack frame, parlons de quels sont les attributs pertinents de l'objet stack frame ? Quelle est la structure des données ?
1. Table des variables locales
C'est un espace de stockage pour un ensemble de variables, utilisé pour stocker les méthodes et les variables internes. L'allocation de capacité maximale de la table de variables locales a été complétée lors de la compilation Java. Pour parler franchement, la table de variables locales est une table qui stocke les variables locales et est utilisée pour stocker les variables. Sa capacité est déterminée par l'emplacement de variable (Variable Slot) ; , appelé Slot) à mesurer, Slot est également la plus petite unité ; pour des informations pertinentes, veuillez vous référer à "Compréhension approfondie de Java Virtual Machine 2 Edition" P238 de Zhou Zhiming. Ce qui suit est l'espace mémoire occupé par les types associés ; data
Comme le montre la figure, les types de données de base, à l'exception du double et du long, sont divisés en deux 32 bits (c'est-à-dire 2 emplacements) pour stockage, c'est-à-dire un alignement de bits élevés ; alors que d'autres types n'occupent qu'un seul emplacement de 32 bits. De plus, le type de référence
peut être 32 bits ou 64 bits, ce qui n'est pas clairement spécifié en Java ; . Alors, comment la machine virtuelle accède-t-elle aux variables locales ?
La machine virtuelle utilise la table de variables locales via la méthode de positionnement d'index. La valeur de l'index va de 0 au nombre maximum d'emplacements. Lorsqu'une méthode est exécutée, notamment lorsqu'une méthode d'instance est exécutée, l'index 0 de la table des variables d'instance est par défaut la référence "this" objet de l'objet d'instance auquel appartient la méthode, suivi de 1 à la variable paramètre Slot à la méthode Variables locales internes. De plus, afin d'économiser de l'espace dans le frame de pile, le Slot des variables locales peut être réutilisé, ce qui signifie paramètres de méthode + variables locales au sein de la méthode ! =Nombre maximum d'emplacements. Étant donné que Slot peut être réutilisé, il permet non seulement d'économiser de l'espace, mais joue également un rôle inattendu dans le garbage collection du système. Reportez-vous à P239
2. Pile d'opérandes (Pile d'opérandes)
3. Liaison dynamique
Chaque cadre de pile contient une référence à la méthode attribuée au cadre de pile dans le pool de constantes d'exécution. Cette référence est conservée pour prendre en charge les connexions dynamiques lors des appels de méthode. Il existe un grand nombre de références de symboles dans le pool de constantes du fichier Class. Les instructions d'appel de méthode dans le bytecode prennent comme paramètres les références de symboles pointant vers les méthodes du pool de constantes. Certaines de ces références symboliques seront converties en références directes lors de la phase de chargement de la classe ou lors de la première utilisation. Cette conversion est appelée résolution statique. L'autre partie sera convertie en référence directe lors de chaque exécution, cette partie est appelée connexion dynamique.
4. Adresse de retour de la méthode
Lorsqu'une méthode est exécutée, il existe deux façons de quitter la méthode. La première façon est que le moteur d'exécution rencontre une instruction de bytecode renvoyée par n'importe quelle méthode. À ce moment-là, une valeur de retour peut être transmise à l'appelant de méthode supérieur (la méthode qui appelle la méthode actuelle est appelée l'appelant). valeur de retour ? Le type de valeur de retour sera déterminé en fonction de l'instruction de retour de méthode rencontrée. Cette méthode de sortie de méthode est appelée sortie d'achèvement de méthode normale (Normal Method Invocation Completion).
Une autre façon de quitter est lorsqu'une exception est rencontrée lors de l'exécution de la méthode et que l'exception n'est pas gérée dans le corps de la méthode, qu'il s'agisse d'une exception générée dans la machine virtuelle Java ou en utilisant atthrow dans le code Les exceptions générées par les instructions de bytecode entraîneront la fermeture de la méthode tant qu'aucun gestionnaire d'exception correspondant n'est trouvé dans la table des exceptions de cette méthode. Cette méthode de sortie est appelée Achèvement de l'invocation de méthode brutale. Si une méthode se termine à l’aide d’un exit de complétion d’exception, elle ne générera aucune valeur de retour pour ses appels.
Peu importe la façon dont vous quittez, avant la fin de la méthode, vous devez revenir à l'emplacement où la méthode a été appelée afin que le programme puisse continuer à s'exécuter. Lorsque la méthode revient, vous devrez peut-être enregistrer certaines informations. dans le cadre de pile pour faciliter la récupération. L'état d'exécution de sa méthode de niveau supérieur. De manière générale, lorsque la méthode se termine normalement, la valeur du compteur PC de l'appelant peut être utilisée comme adresse de retour, et cette valeur du compteur est susceptible d'être enregistrée dans le cadre de pile. Lorsqu'une méthode se termine anormalement, l'adresse de retour doit être déterminée par le gestionnaire d'exceptions, et cette partie des informations n'est généralement pas enregistrée dans le cadre de pile.
Le processus de sortie de méthode est en fait équivalent à faire apparaître le cadre de pile actuel. Par conséquent, les opérations possibles lors de la sortie sont : restaurer la table des variables locales et la pile d'opérandes de la méthode supérieure, et renvoyer la valeur de retour (si any) ) est poussé dans la pile d'opérandes de la trame de pile appelante, et la valeur du compteur PC est appelée pour pointer vers une instruction suivant l'instruction d'appel de méthode, etc.
5. Informations supplémentaires
La spécification de la machine virtuelle permet à des implémentations spécifiques de machine virtuelle d'ajouter certaines informations non décrites dans la spécification au cadre de pile, telles que height Informations connexes, cette partie des informations dépend entièrement de l'implémentation spécifique de la machine virtuelle. Dans le développement réel, les connexions dynamiques, les adresses de retour de méthode et autres informations supplémentaires sont généralement regroupées en une seule catégorie, appelée informations sur le cadre de pile.
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!