Maison >Java >javaDidacticiel >Quel est le processus de chargement des classes JVM ?

Quel est le processus de chargement des classes JVM ?

不言
不言original
2019-04-10 10:35:482288parcourir

Quel est le processus de chargement des classes JVM ?

Le processus de chargement de la classe jvm est divisé en trois étapes : chargement, connexion et initialisation.

Quel est le processus de chargement des classes JVM ?

Chargement

Chargez cette classe de l'extérieur dans la jvm via le chemin complet de la classe, et à en même temps dans la zone méthode Générez les informations de description de la classe et générez le type Claas de la classe en mémoire. En tant qu'entrée d'accès aux données de cette classe dans la zone de méthode.

Connectez

C'est une étape très importante. Le processus est assez compliqué et se divise en trois étapes : vérification, préparation et analyse. ​

Vérification : Assurer l'exactitude du chargement des classes. De manière générale, il n'y aura aucun problème avec les fichiers de classe compilés par javac, mais les fichiers de classe de certaines personnes peuvent être compilés par d'autres méthodes, qui peuvent ne pas être conformes aux règles de compilation JVM. Cette étape consiste à filtrer cette partie.

Préparation : Allouez de la mémoire pour les variables statiques de la classe et initialisez-les aux valeurs par défaut. Nous savons tous que les variables statiques peuvent recevoir des valeurs manuellement sans nous. Elles auront naturellement une valeur initiale. Par exemple, la valeur initiale du type int est 0, la valeur initiale du type booléen est fausse et la valeur initiale est fausse. la valeur du type référence est nulle. Notez ici que seule la mémoire est allouée aux variables statiques et qu'il n'y a aucune instance d'objet pour le moment

Analyse : Convertissez les références de symboles dans la classe en références directes. Expliquez les références symboliques et les références directes. Par exemple, lorsque nous utilisons la méthode B dans la méthode A, A(){B();}, B() voici une référence symbolique. Lorsque nous avons appris Java pour la première fois, nous savions tous qu'il s'agissait d'une référence à Java et pensions que B. a pointé l'adresse mémoire de la méthode B. Mais celle-ci est incomplète. Le B ici n'est qu'une référence symbolique. Il n'a pas beaucoup de signification pratique pour appeler la méthode. Il peut être considéré comme un signe pour le programmeur de laisser le programmeur le faire. Sachez que cette méthode peut être comme cet appel, mais lorsque la méthode B est réellement appelée, elle pointe vers l'adresse mémoire de la méthode B via un pointeur. Ce pointeur est en réalité responsable de l'appel de méthode, et c'est une référence directe.

Initialisation

Dans la phase d'initialisation, la méthode d'initialisation clinit() de la classe sera appelée pour attribuer des valeurs réelles aux variables statiques (par exemple, attribuer valeur à 123) et exécutez un morceau de code statique. Il n'y a pas de contrainte obligatoire sur le timing de chargement dans la spécification JVM Cependant, pour l'initialisation, la spécification JVM stipule strictement qu'il n'y a que 5 situations dans lesquelles une classe doit être initialisée immédiatement :

Expliquons comment le La méthode clinit() est générée. La méthode clinit() est générée par le compilateur qui collecte automatiquement les variables statiques et les instructions statiques dans la classe. L'ordre dans lequel le compilateur collecte est déterminé par l'ordre dans lequel les instructions apparaissent.Un bloc d'instructions statique ne peut copier que les variables définies après lui, mais ne peut pas les utiliser, comme le montre la figure ci-dessous, et la spécification de la machine virtuelle garantit que le clinit () méthode de la classe parent Doit être exécutée avant les sous-classes, mais pas par héritage.

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn