


Introduction détaillée à JAVA Virtual Machine (JVM) (5) - Mécanisme de chargement de classe
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.
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.
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.
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 depublic static int value=123;
public static final int value=123;
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Ce projet est conçu pour permettre aux développeurs de surveiller plus rapidement plusieurs JVM hôtes distants. Si votre projet est Spring Boot, il est très facile à intégrer. S'il ne s'agit pas de Spring Boot, ne vous découragez pas. initialiser rapidement un programme de démarrage Spring et le présenter vous-même suffit.

Les paramètres de ligne de commande JVM vous permettent d'ajuster le comportement de la JVM à un niveau plus fin. Les paramètres communs incluent : Définir la taille du tas Java (-Xms, -Xmx) Définir la taille de la nouvelle génération (-Xmn) Activer le garbage collector parallèle (-XX:+UseParallelGC) Réduire l'utilisation de la mémoire de la zone Survivor (-XX : -ReduceSurvivorSetInMemory) Éliminer la redondance Éliminer le garbage collection (-XX:-EliminateRedundantGCs) Imprimer les informations sur le garbage collection (-XX:+PrintGC) Utiliser le garbage collector G1 (-XX:-UseG1GC) Définir le temps de pause maximum du garbage collection (-XX:MaxGCPau

Points clés et précautions pour maîtriser l'utilisation de la mémoire de la JVM La JVM (JavaVirtualMachine) est l'environnement dans lequel s'exécutent les applications Java, et le plus important est la gestion de la mémoire de la JVM. Une gestion correcte de la mémoire JVM peut non seulement améliorer les performances des applications, mais également éviter des problèmes tels que des fuites et des débordements de mémoire. Cet article présentera les points et considérations clés de l'utilisation de la mémoire JVM et fournira quelques exemples de code spécifiques. Partitions de mémoire JVM La mémoire JVM est principalement divisée dans les zones suivantes : Heap (Heap)

Une introduction à l'analyse des fonctions et des principes de la machine virtuelle JVM : La machine virtuelle JVM (JavaVirtualMachine) est l'un des composants centraux du langage de programmation Java, et c'est l'un des principaux arguments de vente de Java. Le rôle de la JVM est de compiler le code source Java en bytecodes et d'être responsable de l'exécution de ces bytecodes. Cet article présentera le rôle de la JVM et son fonctionnement, et fournira quelques exemples de code pour aider les lecteurs à mieux comprendre. Fonction : La fonction principale de JVM est de résoudre le problème de portabilité des programmes Java sur différentes plateformes.

Java est un langage de programmation populaire lors du développement d'applications Java, vous pouvez rencontrer des erreurs de dépassement de mémoire JVM. Cette erreur provoque généralement le crash de l'application, affectant l'expérience utilisateur. Cet article explorera les causes des erreurs de dépassement de mémoire JVM et comment gérer et éviter de telles erreurs. Qu’est-ce qu’une erreur de débordement de mémoire JVM ? La machine virtuelle Java (JVM) est l'environnement d'exécution des applications Java. Dans la JVM, la mémoire est divisée en plusieurs zones, notamment le tas, la zone de méthode, la pile, etc. Le tas est utilisé pour stocker les objets créés

Avant d'écrire un programme Java pour vérifier si la JVM est 32 bits ou 64 bits, parlons d'abord de la JVM. JVM est une machine virtuelle Java, responsable de l'exécution du bytecode. Il fait partie de Java Runtime Environment (JRE). Nous savons tous que Java est indépendant de la plate-forme, mais JVM dépend de la plate-forme. Nous avons besoin d'une JVM distincte pour chaque système d'exploitation. Si nous avons le bytecode de n’importe quel code source Java, nous pouvons facilement l’exécuter sur n’importe quelle plate-forme grâce à JVM. L'ensemble du processus d'exécution du fichier Java est le suivant - Tout d'abord, nous enregistrons le code source Java avec l'extension .java et le compilateur le convertit en bytecode avec l'extension .class. Cela se produit au moment de la compilation. Maintenant, au moment de l'exécution, J

Paramètres de mémoire JVM : comment ajuster raisonnablement la taille de la mémoire tas ? Dans les applications Java, la JVM est le composant clé responsable de la gestion de la mémoire. Parmi eux, la mémoire tas est utilisée pour stocker les instances d'objets. Le paramètre de taille de la mémoire tas a un impact important sur les performances et la stabilité de l'application. Cet article explique comment ajuster raisonnablement la taille de la mémoire du tas, avec des exemples de code spécifiques. Tout d’abord, nous devons comprendre quelques connaissances de base sur la mémoire JVM. La mémoire de la JVM est divisée en plusieurs zones, notamment la mémoire tas, la mémoire pile, la zone méthode, etc. dans

Explication détaillée des principes JVM : Une exploration approfondie du principe de fonctionnement de la machine virtuelle Java nécessite des exemples de code spécifiques 1. Introduction Avec le développement rapide et l'application généralisée du langage de programmation Java, la machine virtuelle Java (JavaVirtualMachine, appelée JVM ) est également devenu indispensable dans le développement de logiciels. En tant qu'environnement d'exécution des programmes Java, JVM peut fournir des fonctionnalités multiplateformes, permettant aux programmes Java de s'exécuter sur différents systèmes d'exploitation. Dans cet article, nous examinerons le fonctionnement de la JVM
