Chargement de classe
Le chargement de classe fait référence à la méthode de lecture des données binaires du fichier .class de la classe et de leur placement dans la zone de données d'exécution, puis créez un objet java.lang.Class dans la zone de tas pour encapsuler la structure de données de la classe dans la zone de méthode.
Méthodes de chargement des fichiers .class :
1. Chargez directement depuis le système local
2. Téléchargez les fichiers .class via le réseau
3. Depuis Charger des fichiers .class
à partir de zip, jar et autres fichiers d'archives 4. Extraire les fichiers .class de bases de données propriétaires
5. Compiler dynamiquement les fichiers sources Java en fichiers .class
Le produit final du chargement de classe est l'objet Class situé dans la zone de tas.
L'objet Class encapsule la structure de données de la classe dans la zone de méthode et fournit aux programmeurs Java une interface pour accéder à la structure de données dans la zone de méthode.
Chargeur de classe
Il existe deux types de chargeurs :
1. Le chargeur fourni avec la machine virtuelle Java
Chargeur de classe racine (Bootstrap)
Chargeur de classe d'extension (Extension)
Chargeur de classe système ou chargeur d'application (Système)
Les deux derniers chargeurs sont implémentés en Java, la racine Le chargeur de classe est écrit en C et les programmeurs ne peuvent pas obtenir cette classe en code Java.
2. Chargeur de classe défini par l'utilisateur
Sous-classe de java.lang.ClassLoader
Les utilisateurs peuvent personnaliser la méthode de chargement des classes
Chargement de classe Le compilateur n'a pas besoin d'attendre qu'une classe soit activement utilisée pour la première fois avant de la charger.
La spécification JVM permet au chargeur de classe de précharger une classe lorsqu'elle est censée être utilisée. Si le fichier .class est manquant ou présente une erreur pendant le processus de préchargement, le chargeur de classe doit se charger. pour la première fois dans le programme. Une erreur (LinkageError) n'est signalée que lorsque cette classe est activement utilisée. Si la classe n'a pas été activement utilisée par le programme, le chargeur de classe ne signalera pas d'erreur.
Mécanisme de déchargement de classe
Cycle de vie de la classe
Lorsque la classe Sample est chargée, connectée et initialisée, son cycle de vie commence.
Lorsque l'objet Class représentant la classe Sample n'est plus référencé, c'est-à-dire qu'il est inaccessible, l'objet Class mettra fin à son cycle de vie, et les données de la classe Sample dans la zone méthode seront également déchargées , mettant ainsi fin à la vie du cycle de la classe Sample.
On voit que lorsqu'une classe termine son cycle de vie, cela dépend du moment où l'objet Class qui la représente termine son cycle de vie.
Relation de référence
Objet Loader et Class :
Dans l'implémentation interne du chargeur de classe, une collection Java est utilisée pour stocker les références aux classes chargées.
D'un autre côté, un objet Class fait toujours référence à son chargeur de classe. Appelez la méthode getClassLoader() de l'objet Class pour obtenir son chargeur de classe.
On peut voir qu'il existe une relation bidirectionnelle entre l'instance de classe et le chargeur qui la charge.
Classe, Objet Classe de classe, Objet instance de classe :
Une instance d'une classe fait toujours référence à l'objet Classe représentant la classe.
La méthode getClass() est définie dans la classe Object. Cette méthode renvoie une référence à l'objet Class qui représente la classe à laquelle appartient l'objet.
De plus, toutes les classes Java ont une classe d'attributs statiques, qui fait référence à l'objet Class représentant cette classe.
Déchargement des classes
Les classes chargées par le chargeur de classes fourni avec la machine virtuelle Java ne seront jamais déchargées pendant le cycle de vie de la machine virtuelle.
Comme présenté précédemment, les chargeurs de classes fournis avec la machine virtuelle Java incluent le chargeur de classes racine, le chargeur de classes d'extension et le chargeur de classes système.
La machine virtuelle Java elle-même fera toujours référence à ces chargeurs de classes, et ces chargeurs de classes feront toujours référence aux objets Class des classes qu'ils chargent, donc ces objets Class sont toujours accessibles.
Les classes chargées par les chargeurs de classes définis par l'utilisateur peuvent être déchargées.
Exemple spécifique
La variable loader1 et la variable obj appliquent indirectement l'objet Class représentant la classe Sample, tandis que la variable objClass y fait directement référence.
Si pendant l'exécution du programme, les trois variables de référence sur le côté gauche de l'image ci-dessus sont définies sur null, alors l'objet Sample termine son cycle de vie, l'objet MyClassLoader termine son cycle de vie et l'objet Sample termine son cycle de vie. L'objet de classe représentant la classe Sample termine également son cycle de vie, les données binaires de la classe Sample dans la zone méthode sont déchargées.
En cas de nouveau besoin, il vérifiera si l'objet Class de la classe Sample existe. S'il existe, il sera utilisé directement sans rechargement ; si la classe Sample n'existe pas, elle sera rechargée et une nouvelle sera créée ; généré dans la zone de tas de la machine virtuelle Java. La nouvelle instance Class représente la classe Sample (vous pouvez vérifier s'il s'agit de la même instance via le code de hachage).
Pour plus d'articles liés à l'analyse du mécanisme de chargement et de déchargement des classes Java à partir de la JVM, veuillez faire attention au site Web PHP chinois !