Cet article explique l'architecture JVM en détail avec des images et du texte
JVM est un ordinateur abstrait basé sur la pilearchitecture Il possède son propre jeu d'instructions et sa propre gestion de la mémoire, et est. une multiplateforme Java Sur cette base, la JVM interprète et exécute le bytecode, ou compile le bytecode en code local pour exécution. L'architecture de la machine virtuelle Java est la suivante :
Class File est une plateforme- fichier binaire indépendant, contient du bytecode qui peut être exécuté par la JVM, dans lequel les multi-octets sont dans l'ordre big-endian et les caractères utilisent un codage UTF-8 amélioré. Le fichier Class décrit avec précision les informations d'une classe ou d'une interface, notamment :
Constantepool : valeur numérique et chaîne Constantes littérales, métadonnées telles que les noms de classe, les noms de méthodes, les paramètres et divers symboles Référencez les instructions de bytecode de la méthode
, le nombre de paramètres, variables locales , profondeur maximale de la pile d'opérandes, exception et autres informations
Chargeur de classe, JVM est dynamique lorsque la classe est utilisée pour la première fois le chargement, la liaison et l'initialisation. Le modèle de chargement par défaut de la JVM est un modèle de délégation parent. Il existe une hiérarchie de relations parent-enfant entre les chargeurs de classe et est implémenté en interne à l'aide de la composition. De plus, il existe d'autres méthodes de chargement, telles que le chargement de Servlet. Il essaie d'abord de se charger lui-même, puis délègue au chargeur supérieur s'il échoue l'isolation de classe entre les chargeurs OSGI ; , et il n'y a pas de distinction entre les niveaux supérieur et inférieur.
Le chargement consiste à prendre la classe ou l'interface représentée par le fichier Class et à créer un objet java.lang.Class correspondant dans la zone de méthode JVM , comme Class.forName(), ClassLoader.loadClass() et la réflexion peuvent déclencher le chargement de la classe. Lorsqu'un chargement de classe est déclenché, le processus détaillé est le suivant :
Vérifier si la classe a été chargée
Déléguer la demande de chargement à la classe supérieure chargeant
Essayez de rechercher la classe et chargez-la
Lorsque ClassLoader ne trouve pas la classe dans le chemin de classe, il lancera ClassNotFoundException; Lorsque la classe A fait référence à la classe B, la classe A a été chargée avec succès, mais le fichier de classe n'est pas trouvé lors du chargement de B, une NoClassDefFoundError sera levée. JVM possède les chargeurs de classes suivants :
Bootstrap ClassLoader, démarre le chargeur de classes et charge le noyau Java bibliothèque de classesjrelib 🎜 >
ApplicationChargeur de classe d'application, charge les classes dans la variable d'environnement CLASSPATH
statique et initialisez-les aux valeurs par défaut, aucune instruction de bytecode ne sera exécutée.
définitions et s. Les champs statiques de la classe parent seront initialisés avant les champs statiques de la classe enfant. À ce stade, une classe ou une interface est chargée en mémoire et la JVM garantira que l'ensemble du processus est thread-safe Zone de méthode : partage de threads, qui stocke le pool de constantes d'exécution, les informations sur le champ de classe et la méthode, les variables statiques et le bytecode de méthode, et constitue la logique du tas composant, le garbage collection pour cette partie est facultatif. Il convient de mentionner que Hotspot JVM a ajusté le contenu de cette partie de la mémoire depuis JDK8. L'allocation des métadonnées de classe utilise la mémoire locale, et les String internes et les variables statiques de classe ont été déplacées vers le tas Java. . Pool de constantes d'exécution : il joue un rôle central pour la JVM, impliquant essentiellement des méthodes ou des champs, la JVM recherchera son adresse mémoire spécifique dans le pool de constantes d'exécution. Heap : partage de threads, stockage d'objets d'instance, de variables d'instance et de tableaux, est le domaine principal du garbage collection. Pile JVM : Thread privé, utilisé pour stocker les cadres de pile lorsqu'une méthode est appelée, un cadre de pile sera créé et poussé sur la pile. Le cadre de pile est regroupé comme suit. Dans : Tableau des variables locales : commence à partir de 0 pour stocker cela, les paramètres de la méthode et les variables locales. Pile d'opérandes : La zone de travail de la méthode, les données sont échangées entre la pile d'opérandes et les variables locales, et les résultats intermédiaires sont stockés. La profondeur de la pile d'opérandes peut être déterminée. au moment de la compilation. Données de trame : valeur de retour de la méthode, répartition des exceptions et référence au pool de constantes d'exécution de la classe où se trouve la méthode actuelle. PC Register : Thread privé, enregistre l'adresse d'instruction actuelle et pointe vers l'adresse d'instruction suivante après l'exécution. Pile de méthodes natives : thread privé, stocke les informations de méthode locale, pile C ou C. lit, traduit et exécute le bytecode. La JVM est basée sur une architecture de pile. Cette pile est la pile d'opérandes, et les instructions de bytecode effectuent diverses opérations à travers elle. Il existe également des machines virtuelles basées sur des registres. Interprète, traduction : L'interprétation du bytecode est plus rapide mais l'exécution est lente. L'inconvénient est que chaque appel de méthode doit être retraduit et interprété. Compilateur JIT, compilation juste à temps : découvrez les méthodes de hotspot fréquemment appelées dans le programme, compilez le bytecode en code local et améliorez les performances. Garbage Collector : recycle les objets non valides, détermine si l'objet est recyclable et peut utiliser différents algorithmes de garbage collection. JNI, appelant des méthodes locales, bibliothèque c/c requise par le moteur d'exécution. Les implémentations JVM grand public incluent la JVM Hotspot d'Oracle, JRockit et la JVM d'IBM. En ce qui concerne le réglage de la JVM, il fait référence par défaut à Hotspot VM, ce qui montre sa popularité. De nos jours, il est un peu difficile de se lancer dans Java sans comprendre la JVM -v-.
. Il convient de noter que l’ensemble du processus n’implique aucun objet instance. Zone de données d'exécution
Le moteur d'exécution
Interface et bibliothèque de méthodes locales
Résumé
Pour écrire du code de haute qualité, vous devez non seulement comprendre la JVM, mais également avoir des connaissances informatiques de base complètes telles que le réglage et le dépannage. En fait, quel que soit le langage que vous utilisez pour le développement, il s'agit d'un processus de construction. et améliorer votre propre système de connaissances informatiques.
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!