Flux de chargement de classe pour un programme simple

Je commence tout juste à apprendre l’architecture interne de Java. J’ai grossièrement compris le concept de chargement de classe qui charge les classes requirejses lorsque jvm s’exécute, ClassNotFoundException est ClassNotFoundException lorsqu’une classe est introuvable et qu’un chargeur de classe spécifique charge les classes référencées par la classe.

Quelqu’un peut-il s’il vous plaît expliquer clairement le stream de chargement de classe, c’est-à-dire la séquence de chargement de classe bootstrap et le chargement de classe défini par l’utilisateur dans l’exemple de code Java ci-dessous.

 import java.io.File; public class Sample { public static void main(Ssortingng[] args) { Ssortingng fileName = "sample"; File file = new File(fileName); file.isFile(); } } 

J’ai également appris d’un matériau de référence que ” classloader conserve les espaces de noms des classes qu’il charge”. Par espaces de noms, cela signifie-t-il les noms littéraux de la classe? Est-ce que quelqu’un peut aussi expliquer l’implication / l’avantage de cela?

Vous exécuterez votre classe Sample comme suit

> java Sample

pour peu de magie, consultez la sortie de l’option -verbose:class et vous voyez des tonnes de lignes suivantes ..

 [Opened C:\jdk1.6.0_14\jre\lib\rt.jar] [Loaded java.lang.Object from C:\jdk1.6.0_14\jre\lib\rt.jar] [Loaded java.io.Serializable from C:\jdk1.6.0_14\jre\lib\rt.jar] [Loaded java.lang.Comparable from C:\jdk1.6.0_14\jre\lib\rt.jar] . . . . . . [Loaded java.security.cert.Certificate from C:\jdk1.6.0_14\jre\lib\rt.jar] [Loaded Sample from file:/D:/tmp/] [Loaded java.lang.Shutdown from C:\jdk1.6.0_14\jre\lib\rt.jar] [Loaded java.lang.Shutdown$Lock from C:\jdk1.6.0_14\jre\lib\rt.jar] 

Vous voyez un tas de classes de \jre\lib\rt.jar sont chargées, bien avant que votre classe ne soit chargée par le chargeur de classe Bootstrap (ou Primordial). Ce sont les pré-requirejs pour exécuter tout programme Java chargé par Bootstrap.

Un autre ensemble de bocaux est chargé par le chargeur de classe d’ Extension . Dans cet exemple particulier, aucune classe de la bibliothèque lib \jre\lib\ext n’était nécessaire. Mais le chargeur de classe d’extension se voit atsortingbuer spécifiquement la tâche de charger les classes à partir de la bibliothèque d’extension.

EDIT: Outre les classes java standard de plate-forme, Sun / Oracle fournit également un ensemble de jars utilisés pour étendre l’API principale de la plate-forme . Les fichiers JAR placés dans le dossier d’extension lib sont automatiquement placés dans le classpath et ne doivent donc pas être inclus explicitement dans classpath. Voici un bel article officiel sur le même sujet.

Enfin, votre classe Sample est chargée par le chargeur de classe d’ Application une fois le chargement de Bootstrap et de l’extension terminé.

Hiérarchie de chargeur de classes

Chaque fois qu’une nouvelle JVM est démarrée, le classloader bootstrap est chargé de charger en premier les classes de clés Java (à partir du package java.lang ) et d’autres classes d’exécution. Le classloader bootstrap est un parent de tous les autres chargeurs de classes. Par conséquent, c’est le seul sans parent.

Vient ensuite le classloader d’extension. Il possède le classloader bootstrap en tant que parent et est responsable du chargement des classes à partir de tous .jar fichiers .jar conservés dans le chemin java.ext.dirs . java.ext.dirs -ci sont disponibles quel que soit le classpath de la JVM.

Le troisième et le plus important classloader du sharepoint vue du développeur est le classloader du système de classes, qui est un enfant immédiat du chargeur de classes d’extension. Il charge les classes des répertoires et des fichiers java.class.path spécifiés par la CLASSPATH environnement CLASSPATH , la propriété système -classpath ou l’option de ligne de commande -classpath .

Hiérarchie de chargeur de classes

Espace de noms ClassLoader

En Java, une classe est identifiée de manière unique à l’aide de ClassLoader + Class car la même classe peut être chargée par deux chargeurs de classes différents.

 Class A loaded by ClassLoader A != Class A loaded by ClassLoader B 

Comment est-ce utile?

Il est utile pour définir différentes politiques d’access et de protection pour différents chargeurs de classes. Prenons un exemple d’applet chargé avec un chargeur de classes différent, vous ne voudriez pas qu’une application tierce accède à vos ressources. Donc, pour la sécurité, il est important de maintenir différents espaces de noms.

JVM gère un pool d’exécution dans la zone permgen où les classes sont chargées. Chaque fois qu’une classe est référencée, le chargeur de classe par défaut trouve la classe dans le chemin de classe et la charge dans ce pool. Et ce n’est pas spécifique aux classes définies par l’utilisateur ou aux classes fournies dans JDK. Lorsqu’une classe est référencée, elle est chargée dans la mémoire.

Les classes chargées par le ClassLoader sont stockées en interne dans l’instance ClassLoader

 // The classes loaded by this class loader. The only purpose of this table // is to keep the classes from being GC'ed until the loader is GC'ed. private final Vector> classes = new Vector<>(); 

Lorsque la classe doit être ajoutée à la mémoire, la fonction suivante est appelée:

 // Invoked by the VM to record every loaded class with this loader. void addClass(Class c) { classes.addElement(c); } 

Vous trouverez un diagramme utile sur le fonctionnement des chargeurs de classe.

entrer la description de l'image ici

La machine virtuelle Java démarre en créant une classe initiale, spécifiée de manière dépendante de l’implémentation, à l’aide du chargeur de classe bootstrap ( §5.3.1 ). La machine virtuelle Java associe ensuite la classe initiale, l’initialise et les variables d’instance statiques déclarées et appelle enfin la méthode de classe publique void main (Ssortingng []) . L’invocation de cette méthode entraîne toute exécution ultérieure. L’exécution des instructions de la machine virtuelle Java constituant la méthode principale peut entraîner la liaison (et par conséquent la création) de classes et d’interfaces supplémentaires, ainsi que l’appel de méthodes supplémentaires.

lire ce lien

Le processus de chargement peut être considéré comme une interaction entre le sous-système Classloader et la zone de mémoire de JVM.

Classloader fonctionne en trois étapes générales 1.) Chargement 2.) Liaison et 3.) Initialisation.

L’interaction très basique entre le sous-système Classloader et la zone de mémoire se produit pendant la liaison (en dehors des autres interactions!)

L’activité de liaison est subdivisée en i.) Vérifier ii.) Préparer et iii.) Résoudre. Vérifier: c’est plus pour la sécurité, la compilation valide est vérifiée. Dans l’étape ii.) Préparer – la mémoire de variables statiques est allouée et affectée avec des valeurs par défaut. Et en

iii.) Résoudre: les références symboliques sont remplacées par des références originales de la “zone de méthode” qui contient des données de niveau de classe et des variables statiques.

Arch JVM