Chargement et démarrage de la JVM (mécanisme de délégation parentale)

Exploration 1: Comment "nouveau" un objet

Exemple: créer une instance de voiture via une nouvelle

Le fichier de classe est chargé dans la machine virtuelle JVM par ClassLoader et le fichier de classe de voiture est initialisé en même temps,

Ce fichier est un modèle de l'instance Car et toutes les instances sont créées sur la base de ce modèle.

Ainsi, lorsque nous utilisons le mot-clé "new" pour créer un objet, nous obtenons en fait une copie de "Car Class".

 

Exploration 2: mécanisme de délégation parentale

Quatre chargeurs

Afficher le code source sous idée pour comprendre le processus d'exécution

ctrl + N , recherchez ClassLoader , puis sélectionnez la classe sous java.lang

Après être entré dans la classe, ctrl + F , recherchez loadClass

protected Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // 首先检查这个classsh是否已经加载过了
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    // c==null表示没有加载,如果有父类的加载器则让父类加载器加载
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        //如果父类的加载器为空 则说明递归到bootStrapClassloader了
                        //bootStrapClassloader比较特殊无法通过get获取
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {}
                if (c == null) {
                    //如果bootstrapClassLoader 仍然没有加载过,则递归回来,尝试自己去加载class
                    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;
        }
    }

Processus de chargement de classe

La figure est de haut en bas, à gauche puis exécutée


Mécanisme de délégation parentale

1. Empêchez le chargement répété du même .class. Posez la question ci-dessus en confiant. Une fois chargé, il n'est pas nécessaire de le charger à nouveau. Assurer la sécurité des données.
2. Assurez-vous que le noyau .classne peut pas être altéré. Grâce à la méthode de délégation, le noyau ne sera pas falsifié .clas, même s'il est falsifié, il ne sera pas chargé, et même s'il est chargé, ce ne sera pas le même .classobjet. Différents chargeurs chargent le même objet et .classpas le même Classobjet. Cela garantit la Classsécurité d'exécution.

L'isolement du bac à sable est l'objectif et la délégation parentale est la réalisation.

Il n'est pas difficile de voir sur cette image que les classes sous des packages tels que java, javax et sun (tels que java.lang.Object, java.lang.String, etc.) sont toutes chargées par le chargeur de classe de démarrage, nous are Ces classes n'ont pas besoin d'être empaquetées, et si nous créons des classes avec le même nom sous le même chemin, elles ne peuvent pas être chargées.

 

 

 

 

++++++++++++++++++++++++++++++++++++
+ Si vous avez des questions, s'il vous plaît + Q: 1602701980 discutez ensemble +
++++ ++++++++++++++++++++++++++++++++

Je suppose que tu aimes

Origine blog.csdn.net/shenyuye/article/details/108063087
conseillé
Classement