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

Guo d'à côté. 2021-09-15 08:21:24
zhaijia days salt fish turn


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://javamana.com/2021/09/20210915081450788d.html

  1. Spring中@within与@target的一些区别
  2. 力荐:提高千倍效率的一些 Java 代码小技巧
  3. Redis技术专题系列之帮你从底层彻底吃透RDB技术原理(基础篇)
  4. Juan Benet et vitalik buterin discutent des réflexions sur les médias sociaux décentralisés
  5. Ipfs Weekly Report 152 | pinata launched "submarining"
  6. Performance optimization issue 03 - HTTP request optimization
  7. JavaScript genrator generator
  8. 字节跳动Java面试全套真题解析在互联网火了,面试大厂应该注意哪些问题?
  9. 字节跳动Java社招,2021年阿里 腾讯 快手offer都已拿到!
  10. 用Java实现红黑树
  11. 使用Redis Stream来做消息队列和在Asp.Net Core中的实现
  12. 海量列式非关系数据库HBase 架构,shell与API
  13. Redis Technology Topic Series vous aide à comprendre les principes de la technologie rdb du Bas (Basic)
  14. Conseils: quelques conseils pour améliorer l'efficacité du Code Java
  15. Quelques différences entre @ within et @ Target au printemps
  16. 海量列式非關系數據庫HBase 架構,shell與API
  17. Architecture, Shell et API de base de données non relationnelle à grande échelle
  18. Mise en œuvre de l'arbre Rouge et noir en Java
  19. Byte Hopping Java Service Call, 2021 Alibaba Tencent Express offer a été obtenu!
  20. Byte Jump Java interview Full Set of true Problems Analysis in Internet fire, interview Factory should pay attention to what Problems?
  21. La dernière réponse à l'entrevue de développement Android, l'hiver froid de l'industrie
  22. A young Lexus, the new NX refuses to be mediocre and mature
  23. Interprétation approfondie de l'équipe sin7y: application de plookup dans la conception de zkevm
  24. Java basic knowledge point Combing, redis Common Data Structures and Using scenario Analysis,
  25. Five minutes to understand MySQL index push down
  26. Data structure and algorithm (XI) -- algorithm recursion
  27. Programmation asynchrone Java scirp, développement frontal de base
  28. Java basic knowledge point video, three sides ant Gold Clothing successfully obtained offer,
  29. Oracle Linux bascule le noyau uek vers le noyau rhck pour résoudre les problèmes de compatibilité acfs
  30. After the grand finale of spring in jade mansion, after reading many comments, I began to sympathize with white deer
  31. 字节跳动Java高级工程师,统一命名服务、集群管理、分布式应用?
  32. 字节跳动Java高级工程师,深入分布式缓存从原理到实践技术分享,
  33. 字节跳动第三轮技术面,阿里P8架构师Java大厂面试题总结,
  34. 字节跳动社招Java面试,超通俗解析CountDownLatch用法和源码,
  35. 字节跳动最新开源,最经典的HashMap图文详解,
  36. 字節跳動第三輪技術面,阿裏P8架構師Java大廠面試題總結,
  37. Byte Jumping the Third Third Technical surface, Ali P8 Architect Java Factory Interview Question summary,
  38. L'ingénieur Java senior de Byte Hopping approfondit la mise en cache distribuée, du principe au partage de la technologie pratique.
  39. Byte Jump Java Senior Engineer, Unified Naming service, Cluster Management, Distributed application?
  40. Plusieurs méthodes de transfert de fichiers entre Windows et Linux
  41. 快速从 Windows 切换到 Linux 环境
  42. 五分钟向MySql数据库插入一千万条数据
  43. Java日期时间API系列42-----一种高效的中文日期格式化和解析方法
  44. 用Java实现红黑树
  45. 使用Redis Stream来做消息队列和在Asp.Net Core中的实现
  46. 海量列式非关系数据库HBase 架构,shell与API
  47. Architecture, Shell et API de base de données non relationnelle à grande échelle
  48. Mise en œuvre de l'arbre Rouge et noir en Java
  49. Java Date Time API Series 42 - - a efficient Chinese Date Format and Analysis Method
  50. 5 minutes pour insérer 10 millions de données dans la base de données MySQL
  51. Passage rapide de Windows à l'environnement Linux
  52. Notes on Java backend development of PostgreSQL (I)
  53. 海量列式非關系數據庫HBase 架構,shell與API
  54. Byte Jump the latest open source, the most Classic hashtap Graph details,
  55. L'interview Java de Byte Hopping Society, l'analyse super populaire de l'utilisation et du code source de countdownlatch,
  56. "Anti Mafia storm" Wang Zhifei's love history is really wonderful: he divorced Zhang Xinyi and married a 14-year-old wife
  57. In spring in the jade mansion, Jia Fengyuan was not moved by his brother's death. Why was su Yingxue changed? The reason is realistic
  58. Adam Oracle Oracle fully constructs Adam token incentive for ecological development
  59. 实战SpringCloud通用请求字段拦截处理,超过500人面试阿里,
  60. 宅家36天咸鱼翻身入职腾讯,Zookeeper一致性级别分析,