Processus de chargement de classe : 1. Phase de chargement ; 2. Phase de vérification ; 3. Phase de préparation, qui alloue principalement de la mémoire et initialise les variables de classe dans la zone de méthode ; 4. Phase d'analyse ; les variables et les zones statiques déclarées dans le fichier de classe sont fusionnées pour générer la méthode cinit et appelées ; 6. Phase d'utilisation 7. Phase de désinstallation ;
L'environnement d'exploitation de ce tutoriel : système windows7, version java8, ordinateur DELL G3.
Comprenant le processus de chargement des classes de la JVM, nous devons principalement répondre à deux questions :
1 Quand la classe est-elle chargée ?
2. Comment la classe est chargée.
1. Conditions de déclenchement du chargement de classe :
Le processus de chargement de classe est principalement divisé en sept étapes : chargement, vérification, préparation, analyse, initialisation, utilisation, déchargement, vérification, préparation, L'ordre des cinq processus d'initialisation et de déchargement est déterminé. La JVM doit suivre strictement cet ordre. La JVM ne stipule pas le moment du chargement de la classe, mais elle stipule strictement que la classe doit être initialisée immédiatement dans cinq circonstances. ce. .
1. Lorsque vous rencontrez les quatre instructions new, getstatic, putstatic et Ensurestatic, si la classe n'a pas été initialisée, la classe sera initialisée en premier.
2. Lors de l'utilisation de la méthode du package java.lang.reflect pour effectuer un appel réflexif à une classe, si la classe n'a pas été initialisée, son initialisation sera déclenchée.
3. Lors de l'initialisation d'une classe, si la classe parent de la classe n'a pas été initialisée, l'initialisation de sa classe parent est d'abord déclenchée.
4. Pour exécuter la JVM, vous devez spécifier une classe principale contenant la méthode principale. La machine virtuelle initialisera d'abord cette classe.
5. Lors de l'utilisation du support du langage dynamique de Jdk1.7, si le résultat final de l'analyse d'une instance java.lang.invoke.MethodHandle est le handle de méthode de REF_getstatic, REF_putstatic, REF_inokestatic et que la classe correspondant à ce handle de méthode a n'a pas été initialisé, déclenche l'initialisation de cette classe.
2. Processus de chargement de classe
Le processus de chargement de classe est principalement divisé en sept étapes : chargement, vérification, préparation, analyse, initialisation, utilisation et déchargement.
1. Chargement :
1) Chargez le flux d'octets binaires correspondant à une classe via son nom complet. Principalement implémenté via des chargeurs de classes.
2) Convertissez la structure de stockage statique représentée par le 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 la mémoire, qui sert d'entrée à chaque classe dans la zone méthode pour accéder à cette classe. (Hotspot génère cette classe dans la zone méthode).
2. Vérification :
1), Vérification du format de fichier : Vérifiez si la constante du numéro de version magique du fichier de classe est dans la plage prise en charge par la machine virtuelle actuelle.
2), Vérification des métadonnées : Vérifiez si les informations sémantiques de la classe répondent aux exigences de la spécification du langage Java.
3), vérification du bytecode : Vérifiez que la sémantique du programme est légale et conforme. Principalement via la structure stackmapframe.
4) Vérification de la référence du symbole : la machine virtuelle convertit la référence du symbole en une référence directe et vérifie si la classe représentée par le nom complet de la référence du symbole peut être trouvée, si le domaine et la méthode correspondants peuvent être trouvés, et si l'autorisation d'accès est légale.
3. Préparation :
La phase de préparation alloue et initialise principalement la mémoire pour les variables de classe (modifiées par un modificateur statique) dans la zone méthode.
数据类型 | 零值 | 数据类型 | 零值 |
---|---|---|---|
int | 0 | boolean | false |
long | 0L | float | 0.0f |
short | 0 | double | 0.0d |
char | 'u0000' | reference | null |
byte | 0 |
4. Analyse :
1) Analyse de classe ou d'interface : convertissez les références conformes en références directes aux classes et vérifiez les autorisations d'accès.
2) Analyse de champ : convertissez la référence symbolique du champ en informations de classe à laquelle le champ appartient ou en référence directe au champ de sa classe parent, et vérifiez les autorisations d'accès.
3) Analyse de la méthode de classe : convertissez la référence symbolique de la méthode de classe en informations de classe à laquelle appartient la méthode de classe ou en référence directe au champ de sa classe parent, et vérifiez les autorisations d'accès.
4) Analyse de la méthode d'interface : convertissez la référence symbolique de la méthode d'interface en informations d'interface à laquelle appartient la méthode d'interface ou en référence directe au champ de sa classe parent, et vérifiez les autorisations d'accès.
5. Initialisation :
Dans la phase d'initialisation, le compilateur fusionnera les variables d'affectation statiques et les zones statiques déclarées dans le fichier de classe pour générer la méthode
Chargeur de classe : un chargeur de classe est une implémentation de "chargement du flux d'octets binaires d'une classe via son nom complet". Pour toute classe, il est déterminé conjointement par le chargeur de classe et la classe elle-même dans l'unicité virtuelle dans le machine.
Modèle de délégation parentale :
1. Bootstrap ClassLoader démarre le chargeur de classe et est responsable du chargement de
2. L'extension ClassLoader étend le chargeur de classe et est responsable du chargement.
3. Application ClassLoader Le chargeur de classe d'application est responsable du chargement de la bibliothèque de classes JAVA sous le chemin CLASSPATH.
4. User ClassLoader Chargeur de classe défini par l'utilisateur.
Le modèle de délégation parent charge les classes de cette manière : lorsque le chargeur de classe reçoit une demande de chargement d'une classe, il délègue d'abord la classe parent pour charger la classe. Tous les chargeurs de classe utilisent cette méthode, donc toutes les demandes de chargement de classe atteindront le. Classe parent de niveau supérieur, si la classe parent ne peut pas être chargée, utilisez ce chargeur de classe pour la charger. De cette façon, il existe une relation hiérarchique entre les chargeurs de classes, ce qui peut garantir que les classes de base de Java sont chargées par le même chargeur de classes, ce qui joue un rôle essentiel dans la stabilité du système Java.
Tutoriels vidéo associés recommandés : Tutoriel vidéo Java
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!