recherche
MaisonJavajavaDidacticielCompréhension approfondie des chargeurs Java

Compréhension approfondie des chargeurs Java

Nov 29, 2019 pm 01:44 PM
java类加载器

Compréhension approfondie des chargeurs Java

1. Classes et chargeurs de classes

Chargeur de classes : La première étape de la phase de chargement, via le nom complet d'une classe. chargez le flux d'octets binaires de cette classe dans le jvm.

Classes et chargeurs de classes : le caractère unique de toute classe est déterminé par elle-même et par le chargeur de classe qui la charge. Le fait que deux classes soient égales dépend du principe qu'elles sont chargées par le même chargeur de classe.

La machine virtuelle JVM comprend deux chargeurs de classe : l'un est le chargeur de classe de démarrage (Bootstrap ClassLoader), qui est implémenté en C++ ; l'autre est tous les autres chargeurs de classe implémentés en Java.

Du point de vue d'un programme Java :

1) Démarrez le chargeur de classes : responsable du chargement des classes dans le répertoire lib ou dans le chemin spécifié par le paramètre -Xbootclasspath. , le nom du fichier est obligatoire. Il est reconnu par la machine virtuelle. S'il n'est pas reconnu par la jvm, il ne peut pas être chargé.

2) Chargeur de classe d'extension : responsable du chargement de toutes les bibliothèques de classes dans le répertoire libexit ou dans le chemin spécifié par la variable système java.exit.dirs.

3) Chargeur de classe d'application (chargeur de classe système) : C'est la valeur de retour de la méthode getSystemClassloader() dans Classloader. Responsable du chargement de la bibliothèque de classes spécifiée sur le chemin de classe utilisateur S'il n'y a pas de chargeur de classe personnalisé dans l'application, ce sera le chargeur de classe par défaut dans le programme.

Enseignement vidéo en ligne gratuit : Tutoriel vidéo Java

Modèle de délégation parentale

Compréhension approfondie des chargeurs Java

À l'exception du chargeur de classe de démarrage de niveau supérieur, tous les autres chargeurs de classe ont leur propre chargeur de classe parent. La relation parent-enfant n'est pas implémentée par héritage, mais par une relation de combinaison pour réutiliser le chargeur de classe parent.

Processus de travail : le chargeur de classe reçoit la demande de chargement de classe –> délègue la demande au chargeur de classe parent (jusqu'à ce que le chargeur de classe de niveau supérieur soit démarré) –> l'échec de chargement est renvoyé au chargeur de classe enfant –> Le chargeur de sous-classe tente de charger

Avantages du modèle de délégation parent : assurer la stabilité de l'API Java sous-jacente et éviter de charger des classes personnalisées avec le même nom (Object ) comme classe de base, ce qui entraîne de multiples différences de classe (objet) portant le même nom, provoquant une confusion dans le comportement de base de Java.

Code source du modèle de délégation parentale :

La méthode ajoute un verrou de synchronisation pour garantir la sécurité des threads. Vérifiez d'abord si la classe a été chargée. Sinon, appelez le parent. chargeur de classe. méthode loadClass(), si le chargeur de classe parent est vide, cela signifie le chargeur de classe de démarrage, alors le chargeur de classe de démarrage est appelé.

Si la classe parent ne parvient pas à se charger, une ClassNotFoundException sera levée, puis appellera votre propre méthode findClass() pour la charger.

protected Class<?> loadClass(String name, boolean resolve)
    throws ClassNotFoundException
{
    //同步锁
    synchronized (getClassLoadingLock(name)) {
        // 首先检车这个类是不是已被加载
        Class<?> c = findLoadedClass(name);
        if (c == null) {
            long t0 = System.nanoTime();
            try {
                if (parent != null) {
                    //如果父类不为空则调用父类加载器的loadClass方法
                    c = parent.loadClass(name, false);
                } else {
                    //没有父类则默认调用启动类加载器加载
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {
                //如果父类加载器找不到这个类则抛出ClassNotFoundException
            }


            if (c == null) {
                // 父类加载器失败时调用自身的findClass方法加载
                long t1 = System.nanoTime();
                c = findClass(name);


                //记录
                sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                sun.misc.PerfCounter.getFindClasses().increment();
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }
}

3. Destruction du modèle de délégation parentale

1 La première destruction du

modèle de délégation parentale est apparue. dans JDK1 Après 2, alors que le chargeur de classe et la classe abstraite java.lang.ClassLoader existaient déjà.

Par conséquent, pour des raisons de compatibilité ascendante, une nouvelle méthode protégée findClass a été ajoutée à ClassLoader après JDK1.2. Les utilisateurs écrivent leur propre logique de chargement de classe dans la méthode findClass au lieu de remplacer la méthode loadClass pour garantir que le chargement de classe personnalisé est conforme au modèle de délégation parent.

2. La deuxième destruction

Le modèle lui-même est défectueux. La délégation parentale peut assurer l'unification des classes de base de chaque chargeur de classe. C'est à ce moment-là que le code utilisateur appelle la classe de base. Elle ne s'applique pas si la classe de base rappelle le code utilisateur. Par exemple, dans les scénarios impliquant SPI, chargez le code SPI requis.

Pour une introduction au mécanisme SPI, veuillez vous référer à d'autres articles.

Afin de résoudre ce problème, le chargeur de contexte de thread (Thread Context ClassLoader) est introduit. Ce chargeur de classe peut être défini via la méthode setContextClassLoader() dans la classe java.lang.Thread. non créé lorsque Le paramètre sera hérité du thread parent. S'il n'y en a pas globalement, la valeur par défaut est le chargeur de classe d'application. Ce chargeur peut être utilisé pour terminer l'action du chargeur de classe parent demandant au chargeur de classe enfant de se charger.

3. Le troisième dommage

est causé par la poursuite de la dynamique du programme, telle que le déploiement à chaud, le remplacement à chaud, etc.

Par exemple, la norme modulaire OSGi R4.2 modifie la structure arborescente de la délégation parentale en une structure de réseau plus complexe.

Tutoriels d'articles Java recommandés : Tutoriel d'introduction à 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!

Déclaration
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Comment utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance?Comment utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance?Mar 17, 2025 pm 05:46 PM

L'article discute de l'utilisation de Maven et Gradle pour la gestion de projet Java, la construction de l'automatisation et la résolution de dépendance, en comparant leurs approches et leurs stratégies d'optimisation.

How do I create and use custom Java libraries (JAR files) with proper versioning and dependency management?How do I create and use custom Java libraries (JAR files) with proper versioning and dependency management?Mar 17, 2025 pm 05:45 PM

L'article discute de la création et de l'utilisation de bibliothèques Java personnalisées (fichiers JAR) avec un versioning approprié et une gestion des dépendances, à l'aide d'outils comme Maven et Gradle.

Comment implémenter la mise en cache à plusieurs niveaux dans les applications Java à l'aide de bibliothèques comme la caféine ou le cache de goyave?Comment implémenter la mise en cache à plusieurs niveaux dans les applications Java à l'aide de bibliothèques comme la caféine ou le cache de goyave?Mar 17, 2025 pm 05:44 PM

L'article examine la mise en œuvre de la mise en cache à plusieurs niveaux en Java à l'aide de la caféine et du cache de goyave pour améliorer les performances de l'application. Il couvre les avantages de configuration, d'intégration et de performance, ainsi que la gestion de la politique de configuration et d'expulsion le meilleur PRA

Comment puis-je utiliser JPA (Java Persistance API) pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux?Comment puis-je utiliser JPA (Java Persistance API) pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux?Mar 17, 2025 pm 05:43 PM

L'article discute de l'utilisation de JPA pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux. Il couvre la configuration, la cartographie des entités et les meilleures pratiques pour optimiser les performances tout en mettant en évidence les pièges potentiels. [159 caractères]

Comment fonctionne le mécanisme de chargement de classe de Java, y compris différents chargeurs de classe et leurs modèles de délégation?Comment fonctionne le mécanisme de chargement de classe de Java, y compris différents chargeurs de classe et leurs modèles de délégation?Mar 17, 2025 pm 05:35 PM

Le chargement de classe de Java implique le chargement, la liaison et l'initialisation des classes à l'aide d'un système hiérarchique avec Bootstrap, Extension et Application Classloaders. Le modèle de délégation parent garantit que les classes de base sont chargées en premier, affectant la classe de classe personnalisée LOA

Comment puis-je utiliser le RMI de Java (Invocation de méthode distante) pour l'informatique distribuée?Comment puis-je utiliser le RMI de Java (Invocation de méthode distante) pour l'informatique distribuée?Mar 11, 2025 pm 05:53 PM

Cet article explique l'invocation de la méthode distante de Java (RMI) pour la construction d'applications distribuées. Il détaille la définition de l'interface, la mise en œuvre, la configuration du registre et l'invocation côté client, résolvant des défis tels que les problèmes de réseau et la sécurité.

Comment utiliser l'API Sockets de Java pour la communication réseau?Comment utiliser l'API Sockets de Java pour la communication réseau?Mar 11, 2025 pm 05:53 PM

Cet article détaille l'API Socket de Java pour la communication réseau, couvrant la configuration du serveur client, la gestion des données et les considérations cruciales telles que la gestion des ressources, la gestion des erreurs et la sécurité. Il explore également les techniques d'optimisation des performances, je

Comment puis-je créer des protocoles de réseautage personnalisés en Java?Comment puis-je créer des protocoles de réseautage personnalisés en Java?Mar 11, 2025 pm 05:52 PM

Cet article détaille la création de protocoles de réseautage Java personnalisés. Il couvre la définition du protocole (structure de données, cadrage, gestion des erreurs, versioning), implémentation (utilisant des sockets), sérialisation des données et meilleures pratiques (efficacité, sécurité, maintien

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

MantisBT

MantisBT

Mantis est un outil Web de suivi des défauts facile à déployer, conçu pour faciliter le suivi des défauts des produits. Cela nécessite PHP, MySQL et un serveur Web. Découvrez nos services de démonstration et d'hébergement.

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Puissant environnement de développement intégré PHP

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

PhpStorm version Mac

PhpStorm version Mac

Le dernier (2018.2.1) outil de développement intégré PHP professionnel

Listes Sec

Listes Sec

SecLists est le compagnon ultime du testeur de sécurité. Il s'agit d'une collection de différents types de listes fréquemment utilisées lors des évaluations de sécurité, le tout en un seul endroit. SecLists contribue à rendre les tests de sécurité plus efficaces et productifs en fournissant facilement toutes les listes dont un testeur de sécurité pourrait avoir besoin. Les types de listes incluent les noms d'utilisateur, les mots de passe, les URL, les charges utiles floues, les modèles de données sensibles, les shells Web, etc. Le testeur peut simplement extraire ce référentiel sur une nouvelle machine de test et il aura accès à tous les types de listes dont il a besoin.