Cet article présente principalement le processus de chargement d'une classe par JVM. Il a une très bonne valeur de référence, jetons-y un coup d'œil avec l'éditeur ci-dessous
Processus de chargement de classe
Le code source Java est compilé en bytecode de classe, JVM Load le fichier bytecode .Class qui décrit les données de classe dans la mémoire, et vérifie, convertit, analyse et initialise les données pour finalement former un type Java qui peut être directement utilisé par la machine virtuelle. Il s'agit du mécanisme de chargement de classe de la machine virtuelle. machine.
Une classe commence par son chargement dans la mémoire de la machine virtuelle jusqu'à ce qu'elle soit déchargée de la mémoire. Son cycle de vie comprend : Chargement, Vérification, Préparation, Résolution. Il y a sept étapes : Initialisation, Utilisation et Déchargement, parmi lesquels les trois parties de vérification, de préparation et d'analyse sont collectivement appelées liens.
L'ordre des cinq étapes de chargement (chargement), vérification, préparation, initialisation et déchargement est fixe Le processus de chargement de la classe doit démarrer dans cet ordre, et. l'étape d'analyse Pas nécessairement ; elle peut dans certains cas démarrer après l'initialisation, pour la fonctionnalité de liaison dynamique d'exécution (également appelée liaison dynamique ou liaison tardive, telle que le remplacement).
1. Chargement :
Pendant la phase de chargement, la machine virtuelle effectue principalement trois choses :
1. a Le nom complet d'une classe pour obtenir le flux d'octets binaires qui définit cette classe.
2. Convertissez la structure de stockage statique représentée par ce flux d'octets en structure de données d'exécution de la zone de méthode.
3. Générez un objet java.lang.Class représentant cette classe dans le tas Java comme entrée d'accès aux données de la zone de méthode
Par rapport aux autres étapes du processus de chargement de classe, l'étape de chargement (préparatoire parlant, l'action d'obtenir le flux d'octets binaires de la classe lors de l'étape de chargement) est l'étape la plus contrôlable pendant la période de développement, car l'étape de chargement Cela peut être fait à l'aide du chargeur de classe (ClassLoader) fourni par le système, ou cela peut être fait par un chargeur de classe défini par l'utilisateur. Les développeurs peuvent contrôler la méthode d'acquisition du flux d'octets en définissant leur propre chargeur de classe.
Une fois la phase de chargement terminée, le flux d'octets binaires en dehors de la machine virtuelle est stocké dans la zone de méthode selon le format requis par la machine virtuelle. Le format de stockage des données dans la zone de méthode est défini par la zone de méthode. Implémentation de la machine. La machine virtuelle La structure de données spécifique de cette zone n'est pas spécifiée. Ensuite, un objet de la classe java.lang.Class est instancié dans le tas Java. Cet objet sert d'interface externe au programme pour accéder à ces types de données dans la zone de méthode.
2. Vérification :
Le but de la phase de vérification est de s'assurer que les informations contenues dans le flux d'octets du fichier Class sont conformes aux spécifications JVM et seront ne causera aucun dommage à la JVM. Si la vérification échoue, une exception java.lang.VerifyError ou son exception de sous-classe sera levée. Le processus de vérification est divisé en quatre étapes
1. Vérification du format de fichier : Vérifiez si le fichier de flux d'octets est conforme à la spécification du format de fichier Class et peut être traité correctement par la machine virtuelle actuelle.
2. Vérification des métadonnées : Il s'agit d'une analyse sémantique des informations décrites par le bytecode pour s'assurer que les informations décrites sont conformes aux spécifications du langage Java.
3. Vérification du bytecode : elle analyse principalement le flux de données et le flux de contrôle pour garantir que les méthodes de la classe vérifiée n'endommageront pas l'environnement virtuel au moment de l'exécution. machine.
4. Vérification de la référence du symbole : la vérification de la référence du symbole se produit lorsque la machine virtuelle convertit la référence du symbole en une référence directe. Cette action de conversion se produira pendant la phase d'analyse. .
3. Préparation :
La phase de préparation alloue de la mémoire pour les variables et définit l'initialisation des variables de classe. A ce stade, seules les variables de la classe (variables statiques modifiées) sont allouées, pas les variables d'instance de la classe. Pour les variables qui ne sont plus définitives, la JVM les mettra à "valeur zéro" au lieu de la valeur de leur instruction d'affectation :
pirvate static int size = 12
Puis à ce stade; , La valeur de size est 0 et non 12. Les variables de classe modifiées par final se verront attribuer des valeurs réelles.
4. Analyse :
La phase d'analyse est le processus de remplacement des références de symboles dans le pool de constantes de la machine virtuelle par des références directes.
Référence de symbole : une référence symbolique est un ensemble de symboles pour décrire l'objet cible référencé. Le symbole peut être n'importe quelle forme de littéral, à condition que la cible puisse être localisée sans ambiguïté lorsqu'elle est utilisée. Les références symboliques n'ont rien à voir avec la disposition de la mémoire implémentée par la machine virtuelle et l'objet cible référencé ne doit pas nécessairement être chargé en mémoire.
Référence directe : une référence directe peut être un pointeur pointant directement vers l'objet cible, un décalage relatif ou une poignée qui peut localiser indirectement la cible. Les références directes sont liées à l'implémentation de la disposition de la mémoire de la machine virtuelle. Les références directes traduites à partir de la même référence de symbole sur différentes instances de machine virtuelle ne sont généralement pas les mêmes. S'il existe une référence directe, la cible de référence doit déjà exister dans la mémoire.
La spécification de la machine virtuelle ne précise pas l'heure précise à laquelle la phase d'analyse se produit. Elle ne nécessite que 13 opérations telles que anewarry, checkcast, getfield, instanceof, Ensureinterface, InvocationSpecial, InvoquerStatique, Invoquervirtual, multianewarray, new, putfield et putstatic. Avant les instructions de bytecode des références de symboles, les références de symboles qu'elles utilisent sont analysées en premier, de sorte que l'implémentation de la machine virtuelle jugera si nécessaire s'il faut analyser les références de symboles dans le pool constant lorsque la classe est chargée par le chargeur, ou attendre jusqu'à ce que une référence de symbole est sur le point d'être utilisée avant de la résoudre.
L'action d'analyse est principalement effectuée sur quatre types de références de symboles : classes ou interfaces, champs, méthodes de classe et méthodes d'interface. Correspond respectivement aux quatre types de constantes CONSTANT_Class_Info, CONSTANT_Fieldref_Info, CONSTANT_Methodef_Info et CONSTANT_InterfaceMethoder_Info dans le pool de constantes compilé.
1. Analyse de classe et d'interface
2. 🎜>3. Analyse de la méthode de classe
4. Analyse de la méthode d'interface
5. Initialisation :
La phase d'initialisation d'une classe est la dernière étape du processus de chargement de la classe. Dans la phase de préparation, la variable de classe a reçu la valeur initiale requise par le système, et dans la phase d'initialisation, il s'agit d'initialiser les variables de classe et d'autres ressources selon le plan subjectif réalisé par le programmeur à travers le programme, ou cela peut être exprimé sous un autre angle : la phase d'initialisation consiste à exécuter le constructeur de classe
6. Utilisation :Nouveau thread --- compteur de programme ---- exécution de la pile jvm (référence d'objet) ----- mémoire tas (référence directe) ---- méthode zone
7 .Désinstaller :Collecte des ordures GC
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!