编程知识 cdmana.com

Zhaijia 36 days Salt Fish turn into Tencent, Zookeeper Consistency level analysis,

Le cycle de vie de la classe

La classe commence par être chargée dans la mémoire de la machine virtuelle,Jusqu'à ce que la mémoire soit déchargée,Tout son cycle de vie comprend:Chargement,Validation,Préparez - vous.,Analyse,Initialisation,Utiliser,DésinstallerVoilà.7Étapes.Dont vérification、Préparez - vous.、Analyse3Les parties sont collectivement appelées connexions.

La maison.36Tianxian Fish turned into Tencent,ZookeeperAnalyse du niveau de cohérence,_Programmeur

Chargement、Validation、Préparez - vous.、L'ordre des cinq étapes d'initialisation et de désinstallation est déterminé,Le processus de chargement du type doit commencer étape par étape dans cet ordre,Et la phase d'analyse n'est pas nécessairement:Dans certains cas, il peut commencer après la phase d'initialisation,C'est pour soutenirJavaPropriétés de liaison d'exécution de la langue(Aussi appelé liaison dynamique ou liaison tardive)

Attention!,Voici quelques étapes qui commencent dans l'ordre,Au lieu de procéder ou de terminer dans l'ordre,Parce que ces étapes sont souvent mélangées les unes avec les autres,En général, une phase est appelée ou activée pendant l'exécution d'une autre phase.

Chargement:Trouver et charger les données binaires de la classe

Pendant la phase de chargement,La machine virtuelle doit remplir ce qui suit3Une chose.:

  • 1)Obtenir un flux binaire d'octets qui définit une classe par son nom entièrement qualifié.
  • 2)Convertit la structure de stockage statique représentée par ce flux d'octets en une structure de données d'exécution pour la zone de méthode.
  • 3)Générer en mémoire unjava.lang.ClassObjet,En tant qu'entrée d'accès à diverses données de cette classe de zone de méthode.

La maison.36Tianxian Fish turned into Tencent,ZookeeperAnalyse du niveau de cohérence,_Arrière - plan_02

Validation:Assurez - vous que la classe chargée est correcte

La validation est la première étape de la phase de connexion,L'objectif de cette étape est de s'assurer queClassLe flux d'octets du fichier contient des informations qui répondent aux exigences de la machine virtuelle actuelle,Et ne met pas en danger la sécurité de la machine virtuelle elle - même.La phase de validation sera presque terminée4Mesures d'inspection en plusieurs étapes:

  • Validation du format de fichier: Vérifier que le flux d'octets est conforme àClassSpécification du format de fichier;Par exemple: Oui Non0xCAFEBABEAu début、Si le numéro de version primaire et secondaire est dans le champ de traitement de la machine virtuelle actuelle、Est - ce qu'une constante dans un pool de constantes a un type non pris en charge.
  • Validation des métadonnées:Analyse Sémantique des informations décrites par Bytecode(Attention!: ComparerjavacAnalyse sémantique de la phase de compilation),Pour s'assurer que les informations décrites sont conformes àJavaExigences des spécifications linguistiques;Par exemple: Cette classe a - t - elle des parents,Sauf quejava.lang.ObjectAu - delà.
  • Vérification du code byte:Analyse des flux de données et de contrôle,Déterminer si la sémantique du programme est légale、Logique.
  • Vérification des références symboliques:Assurez - vous que l'action de résolution est exécutée correctement.

La phase de validation est très importante,Mais ce n'est pas nécessaire,Il n'a aucun effet sur la durée d'exécution du programme,Si la classe référencée est validée à plusieurs reprises,On pourrait envisager d'adopter-XverifynoneParamètres pour désactiver la plupart des mesures de validation de classe,Pour réduire le temps de chargement des classes de machines virtuelles.

Préparez - vous.:Assigner la mémoire aux variables statiques de la classe,Et l'initialiser par défaut

La phase de préparation est la phase où la mémoire est officiellement allouée à une variable de classe et où la valeur initiale de la variable de classe est définie,La mémoire utilisée par ces variables sera allouée dans la zone de méthode.

Notes pour cette étape :

  • L'allocation de mémoire à ce stade ne comprend que les variables de classe(ParstaticVariables modifiées),Sans inclure les variables d'instance,La variable instance sera assignée avec l'objet lors de l'Instanciation de l'objet àJavaDans la pile.
  • La valeur initiale définie ici est généralement la valeur zéro par défaut pour le type de données(Par exemple:00LnullfalseAttendez.),Au lieu d'êtreJavaLa valeur explicitement attribuée dans le Code.

Par exemple,:Supposons qu'une variable de classe soit définie comme: public static int value = 3;Alors les variablesvalueLa valeur initiale après la phase de préparation est0,Au lieu de3,Parce qu'il n'y a pas eu deJavaMéthodes,Et mettrevalueAssigner comme3Deput staticL'instruction est après la compilation du programme,Stocké dans le constructeur de classe()Parmi les méthodes,AlorsvalueAssigner comme3L'action de ne sera pas exécutée avant la phase d'initialisation.

  • Pour le type de données de base,Pour les variables de classe(static)Et les variables globales,Si elle n'est pas explicitement assignée et utilisée directement,Le système lui donne une valeur par défaut de zéro,Et pour les variables locales,Vous devez lui assigner une valeur explicite avant de l'utiliser,Sinon, la compilation échoue.

  • Pour être simultanémentstaticEtfinalConstante modifiée,Vous devez lui assigner une valeur explicite au moment de la Déclaration,Sinon, la compilation échoue;Et seulement parfinalLes constantes modifiées peuvent être explicitement assignées au moment de la Déclaration,Vous pouvez également assigner explicitement une valeur à une classe lors de son initialisation,En dernier analyse,Il doit être explicitement assigné avant utilisation,Le système ne lui donne pas de valeur zéro par défaut.

  • Pour le type de données de référencereferenceDis,Comme une référence de tableau、Références d'objets, etc,Si elle n'est pas explicitement assignée et utilisée directement,Le système lui donne une valeur zéro par défaut,C'est - à - dire:null.

  • Si aucun élément du tableau n'est assigné lors de l'initialisation du tableau,Ensuite, les éléments seront attribués à la valeur zéro par défaut en fonction du type de données correspondant.

  • Si le champ de classe existe dans la Feuille de propriétés du champConstantValuePropriétés,C'est - à - dire être simultanémentfinalEtstaticModification,Alors, au stade de la préparation, les variablesvalueSera initialisé àConstValueValeur spécifiée par la propriété.Supposons que la variable de classe ci - dessusvalueDéfini comme: public static final int value = 3;Temps de compilationJavacCe seravalueGénérerConstantValuePropriétés,Pendant la phase de préparation, la machine virtuelle sera basée surConstantValueLes paramètres devalueAssigner comme3.On peut comprendre questatic finalLa constante place son résultat dans le pool de constantes de la classe qui l'appelle au moment de la compilation

Analyse:Convertir une référence symbolique dans une classe en référence directe

La phase de résolution est le processus par lequel une machine virtuelle remplace une référence symbolique dans un pool constant par une référence directe, Les actions d'analyse sont principalement destinées à CatégorieOuInterfaceChampMéthode de classeMéthode d'interfaceType de méthodePoignée de méthodeEt Point d'appel Qualificatif7Le symbole de classe fait référence à.Une référence symbolique est un ensemble de symboles qui décrivent une cible,Ça peut être n'importe quelle quantité littérale.

Citation directeC'est un pointeur vers la cible、Un décalage relatif ou une poignée positionnée indirectement vers la cible.

Initialisation: Variables statiques pour la classe , Bloc de code statique pour effectuer l'initialisation

Initialisation,Assigner les valeurs initiales correctes aux variables statiques de la classe,JVMResponsable de l'initialisation de la classe,Initialiser principalement les variables de classe.InJavaIl y a deux façons de définir la valeur initiale d'une variable de classe dans:

  • La variable de classe de déclaration est la valeur initiale spécifiée
  • Spécifiez une valeur initiale pour la variable de classe en utilisant un bloc de code statique

Procédure d'initialisation de la classe

  • Si cette classe n'a pas été chargée et connectée,Le Programme charge et connecte d'abord la classe
  • Si le parent direct de la classe n'a pas été initialisé,Initialiser d'abord son parent direct
  • S'il y a une instruction d'initialisation dans la classe,Le système exécute ces instructions d'initialisation à tour de rôle

Temps de déclenchement de l'initialisation de la classe

Ce n'est qu'en cas d'utilisation active de la classe que la classe est initialisée,L'utilisation active de la classe comprend les six types suivants:

  • UtilisernewLorsque le mot - clé instancie un objet.

  • Lire ou définir un champ statique de type (ParfinalModification、À l'exception des champs statiques qui ont mis les résultats dans le pool constant au moment de la compilation)Quand.

  • Lorsqu'une méthode statique d'un type est appelée.

  • Utiliserjava.lang.reflectLorsque la méthode du paquet fait un appel de réflexion au type,Si le type n'a pas été initialisé,Vous devez d'abord déclencher son initialisation.

  • Lors de l'initialisation d'une classe,Si vous trouvez que sa classe mère n'a pas été initialisée,Vous devez d'abord déclencher l'initialisation de sa classe mère.

  • Quand la machine virtuelle démarre,L'utilisateur doit spécifier une classe principale à exécuter(Contientmain()Le genre de méthode),L'opportunité virtuelle initialise d'abord cette classe principale.

L'initialisation de classe n'est pas effectuée dans les cas suivants

  1. Référence des champs statiques de la classe mère par sous - classe, Ne déclenchera que l'initialisation de la classe mère , Sans déclencher l'initialisation de la Sous - classe .

  2. Définir un tableau d'objets , L'initialisation de cette classe ne sera pas déclenchée .

  3. Les constantes sont stockées dans le pool de constantes de la classe d'appel pendant la compilation , Essentiellement, il n'y a pas de référence directe à la classe qui définit la constante , Ne touche pas Classe dans laquelle la constante de définition de cheveux est .

  4. Obtenir par nom de classe Class Objet, L'initialisation de la classe ne sera pas déclenchée .

  5. Adoption Class.forName Lors du chargement de la classe spécifiée ,Si vous spécifiez un paramètre initialize Pour false Heure, Et ça ne déclenche pas le début de la classe Initialisation , En fait, ce paramètre indique à la machine virtuelle , Voulez - vous initialiser la classe .

  6. Adoption ClassLoader Par défaut loadClass Méthodes, Et ne déclenche pas l'action d'initialisation .

Utiliser

Classe pour accéder aux interfaces des structures de données dans la zone de méthode , Objet:Heap Données de la zone .

Désinstaller

Java Plusieurs situations où la machine virtuelle mettra fin à son cycle de vie

  • Mise en œuvreSystem.exit()Méthodes
  • Fin de l'exécution normale du programme
  • Le programme s'est terminé anormalement en raison d'une exception ou d'une erreur rencontrée pendant l'exécution
  • En raison d'une erreur dans le système d'exploitationJavaFin du processus de la machine virtuelle

Chargeur de classe

Qu'est - ce qu'un chargeur de classe

L'équipe de conception de machines virtuelles a chargé“Obtenir un flux binaire d'octets décrivant une classe par son nom entièrement qualifié”Cette action metJavaMise en œuvre externe de la machine virtuelle,Afin que l'application puisse décider elle - même comment obtenir les classes dont elle a besoin. Le module de code qui implémente cette action est appelé“Chargeur de classe”.

Hiérarchie des classeurs

La maison.36Tianxian Fish turned into Tencent,ZookeeperAnalyse du niveau de cohérence,_Arrière - plan_03

Le modèle de délégation parentale exige qu'en plus du chargeur de classe de démarrage de haut niveau,Les autres chargeurs de classe ont leurs propres chargeurs de classe parent.Mais ici, les relations parents - enfants entre les chargeurs de classe ne sont généralement pas héritées(Inheritance)De la relation,Au lieu de cela, les combinaisons sont généralement utilisées(Composition)Relations pour réutiliser le Code du chargeur parent.

DeJavaDu point de vue de la machine virtuelle,Il n'y a que deux chargeurs de classe différents:L'un est le chargeur de classe de démarrage(Bootstrap ClassLoader),Ce type de chargeur utiliseC++Mise en œuvre linguistique,Fait partie de la machine virtuelle elle - même;L'autre est tous les autres chargeurs de classe,Ces chargeurs de classe sont tousJavaMise en œuvre linguistique,Indépendant de la machine virtuelle,Et tous héritent de la classe abstraitejava.lang.ClassLoader.

DeJavaDu point de vue des développeurs, Les chargeurs de classe peuvent également être plus détaillés ,La grande majoritéJavaLes programmes sont utilisés pour:3Chargeur de classe fourni par le système:

Chargeur de classe de démarrage(Bootstrap ClassLoader)

Cette classe est responsable du stockage dans <JAVA_HOME>\libDans le catalogue,Ou par-XbootclasspathDans le chemin spécifié par le paramètre,Et est reconnu par la machine virtuelle( Identification par nom de fichier ,Par exemple:rt.jar、tools.jar,Une bibliothèque de classe dont le nom ne correspond pas, même si elle est placée danslibLe Répertoire n'est pas chargé non plus)Bibliothèque de classe chargée dans la mémoire de la machine virtuelle.

Chargeur de classe d'extension(Extension ClassLoader)

Ce chargeur est fourni parsun.misc.Launcher$ExtClassLoaderRéalisation,Il est responsable du chargement<JAVA_HOME>\lib\extDans le catalogue,Ou parjava.ext.dirsToutes les bibliothèques de classe dans le chemin spécifié par la variable système,Les développeurs peuvent utiliser directement le chargeur de classe étendu.

Chargeur de classe d'application(Application ClassLoader)

Ce chargeur de classe est fourni parsun.misc.Launcher$AppClassLoaderPour réaliser.Parce que le chargeur de classe d'application estClassLoaderDans la classegetSystem-ClassLoader()Valeur de retour de la méthode,C'est ce qu'on appelle parfois“Chargeur de classe système”.

Il charge le chemin de classe utilisateur(ClassPath)Toutes les bibliothèques de classe sur,Les développeurs peuvent également utiliser ce chargeur de classe directement dans leur code.Si votre propre chargeur de classe n'a pas été personnalisé dans votre application,En général, c'est le chargeur de classe par défaut dans le programme.

C'est la raison pour laquelle nos applications3Les chargeurs de catégorie sont chargés ensemble.,Si nécessaire, Vous pouvez également ajouter votre propre chargeur de classe .

Enfin

En raison des limites d'espace,Voici quelques illustrations de l'explication des connaissances

 CodeChinaProjet Open Source:【Grandes usines de première ligneJavaAnalyse des questions d'entrevue+Résumé de base notes d'étude+Dernière vidéo d'explication】

La maison.36Tianxian Fish turned into Tencent,ZookeeperAnalyse du niveau de cohérence,_Arrière - plan_04

La maison.36Tianxian Fish turned into Tencent,ZookeeperAnalyse du niveau de cohérence,_Java_05

La maison.36Tianxian Fish turned into Tencent,ZookeeperAnalyse du niveau de cohérence,_Java_06

La maison.36Tianxian Fish turned into Tencent,ZookeeperAnalyse du niveau de cohérence,_Java_07

La maison.36Tianxian Fish turned into Tencent,ZookeeperAnalyse du niveau de cohérence,_Arrière - plan_08

版权声明
本文为[Guo d'à côté.]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/09/20210915081450788d.html

Scroll to Top