Maison  >  Article  >  Java  >  Introduction détaillée à JAVA Virtual Machine (JVM) (5) - Mécanisme de chargement de classe

Introduction détaillée à JAVA Virtual Machine (JVM) (5) - Mécanisme de chargement de classe

王林
王林avant
2019-08-24 15:14:062791parcourir

Dans l'article précédent, nous avons expliqué les fichiers de classe. Dans cet article, nous parlerons de la façon dont la machine virtuelle charge ces fichiers de classe ? Qu'arrive-t-il aux informations contenues dans le fichier Class une fois qu'elles entrent dans la machine virtuelle ? Cela implique le mécanisme de chargement de classe.

Le mécanisme de chargement de classe consiste à charger les données de classe du fichier de classe dans la mémoire, à vérifier les données, à les convertir, à les analyser et à les initialiser, et enfin à former un type Java qui peut être directement utilisé par la machine virtuelle. . Cette série de processus est complétée pendant l'exécution du programme.

Chargeur de classe

Le chargeur de classe est la partie dans la case rouge dans la figure ci-dessous. Il obtient les octets binaires décrivant cette classe via le nom complet d'un. class Stream, chargeant ainsi dynamiquement les classes Java dans l'espace mémoire de la JVM.

Introduction détaillée à JAVA Virtual Machine (JVM) (5) - Mécanisme de chargement de classe

Scénarios applicables

Pour la phase de chargement d'une classe non-tableau, vous peut utiliser le système. Cela peut être fait par le chargeur de classe de démarrage fourni, ou cela peut être fait par un chargeur de classe défini par l'utilisateur.
Pour les classes array, elles sont créées directement par la machine virtuelle Java sans passer par le chargeur de classe.

Mécanisme de délégation parentale

Le mécanisme de délégation parentale est une méthode utilisée par le chargement de classe. Si un chargeur de classe reçoit une demande de chargement de classe, il n'essaiera pas de charger la classe lui-même en premier, mais déléguera la demande au chargeur de classe parent pour qu'il la termine. Cela est vrai pour tous les niveaux de chargeur de classe. Ce n'est que lorsque le chargeur parent signale qu'il ne peut pas terminer la requête que le chargeur enfant essaiera de la charger lui-même.

Introduction détaillée à JAVA Virtual Machine (JVM) (5) - Mécanisme de chargement de classe

Analogie avec la réalité : Xiao Ming veut acheter une pelle jouet, mais il est trop gêné pour le dire directement. Ainsi, la conversation suivante a eu lieu.

Xiao Ming a demandé à son père : Papa, tu as une excavatrice ?
Papa a dit : Non
Puis papa a demandé à grand-père : Papa, papa, tu as une excavatrice ?
Grand-père a dit : Non
Puis grand-père a demandé à l'arrière-grand-père : Papa, papa, tu as une excavatrice ?
Grand-père a dit : Moi non plus. Laissez votre arrière-petit-fils en acheter un.
En conséquence, Xiao Ming a acheté lui-même avec plaisir une pelle jouet.

Catégorie

Le chargeur de classe de démarrage est implémenté en C++ et fait partie de la machine virtuelle elle-même.
D'autres chargeurs de classes sont implémentés dans le langage Java, indépendants de la machine virtuelle, et héritent tous de la classe abstraite java.lang.ClassLoader.

Avantages

Prenons la classe String comme exemple. Même si l'utilisateur écrit lui-même une implémentation de la classe String, lors du chargement de cette classe, il sera uniquement délégué au chargeur de classe de démarrage de charger la classe String d'origine dans le JDK, et la classe String personnalisée ne sera jamais chargée. Cela garantit la sécurité du système.

Quand le chargement des classes est-il effectué ?

Il existe et seulement les 5 façons suivantes pour charger une classe immédiatement

(1) Lors de l'utilisation de new pour instancier un objet ; lire ou configurer les champs statiques d'une classe (modifiés par final, déjà en cours de compilation) ) (sauf lorsque le résultat est placé dans le champ statique du pool de constantes) ;

(2) Lors de l'utilisation de la méthode du package java.lang.reflect pour effectuer un appel réfléchi à la classe. Si la classe n'a pas été initialisée, son initialisation doit être déclenchée en premier.

(3) Lors de l'initialisation d'une classe, s'il s'avère que sa classe parent n'a pas été initialisée, vous devez d'abord déclencher l'initialisation de sa classe parent.

(4) Lorsque la machine virtuelle démarre, l'utilisateur doit spécifier une classe principale à exécuter (la classe contenant la méthode main()), et la machine virtuelle initialisera d'abord la classe principale

Détails du processus de chargement des classes

Le processus de chargement des classes est divisé en 5 étapes. La plupart d'entre eux sont dominés et contrôlés par la machine virtuelle, à l'exception des deux situations suivantes :

Dans la phase de chargement

Les développeurs peuvent participer via un chargeur de classe personnalisé

Dans La phase d'initialisation

exécutera le code du développeur pour initialiser les variables de classe et d'autres ressources

Chargement

Choses que la machine virtuelle doit accomplir :

(1) Obtenez le flux d'octets binaires qui définit cette classe via le nom complet d'une classe.
(2) Convertissez la structure de stockage statique représentée par ce flux d'octets en une structure de données d'exécution dans la zone de méthode.
(3) Générez un objet java.lang.Class représentant cette classe en mémoire comme entrée d'accès à diverses données de cette classe dans la zone de méthode.

Introduction détaillée à JAVA Virtual Machine (JVM) (5) - Mécanisme de chargement de classe

2. Vérification

Le but de la vérification est de garantir que le Fichier de classe Les informations contenues dans le flux d'octets répondent aux exigences de la machine virtuelle actuelle et ne mettront pas en danger la sécurité de la machine virtuelle elle-même.

Il est divisé en 4 étapes : vérification du format de fichier, vérification des métadonnées, vérification du bytecode et vérification de la référence du symbole. Parmi eux, la vérification du format de fichier opère directement sur le flux d'octets et les trois éléments restants sont effectués dans la zone méthode.

3. Préparation

Cette étape est l'étape permettant d'allouer formellement de la mémoire aux variables de classe et de définir la valeur initiale des variables de classe. Il est attribué dans la zone méthode. Il y a deux points à noter :

(1) À l'heure actuelle, seules les variables de classe (variables modifiées par statique) se voient allouer de la mémoire, pas les variables d'objet. La mémoire est allouée à un objet lorsque l'objet est instancié et est allouée au tas Java avec l'objet.

(2) Si une variable de classe n'est pas modifiée par final, sa valeur initiale est la valeur zéro du type de données. Par exemple, le type int est 0 et le type booléen est false. Un exemple pour illustrer : la valeur initiale de

public static int value=123;

après la phase de préparation est 0 au lieu de 123, car aucune méthode java n'a été exécutée à ce moment, et l'instruction putstatic qui attribue la valeur à 123 est après le programme est compilé. , stocké dans la méthode constructeur de classe (). Par conséquent, l'action d'attribuer une valeur à 123 ne sera exécutée que pendant la phase d'initialisation.


public static final int value=123;

Parce qu'il y a final à ce moment, la valeur a été attribuée à 123 dans la phase de préparation.

4. Analyse

La phase d'analyse est le processus dans lequel la machine virtuelle remplace les références de symboles dans le pool constant par des références directes. références. Les classes ou interfaces, les champs, les méthodes de classe, les méthodes d'interface, etc. peuvent être analysés.

Qu'est-ce qu'une référence symbolique :

Une référence symbolique est une chaîne contenant des informations sur la classe, le nom de la méthode, les paramètres de la méthode et d'autres informations. Elle est utilisée dans la table des méthodes de la classe. pour une utilisation réelle. Trouvez la méthode correspondante.

Qu'est-ce qu'une référence directe :

Une référence directe est un offset, que l'on retrouve directement dans la zone mémoire du classe La position de départ du bytecode de la méthode.
La référence du symbole vous indique certaines caractéristiques de cette méthode. Vous devez utiliser ces caractéristiques pour trouver la méthode correspondante. La citation directe signifie vous indiquer directement où se trouve cette méthode.

5. Initialisation

Cette étape est utilisée pour initialiser les variables de classe et d'autres ressources, et est le constructeur de classe d'exécution

Ce qui précède est une explication détaillée du mécanisme de chargement des classes de machines virtuelles JAVA. Pour plus de questions connexes, veuillez visiter le site Web PHP chinois : 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer