JVMのロードと起動(親の委任メカニズム)

探索1:オブジェクトを「新しい」方法

例:newを使用してCarインスタンスを作成する

クラスファイルはClassLoaderによってJVM仮想マシンにロードされ、同時にCarClassファイルが初期化されます。

このファイルはCarインスタンスのテンプレートであり、すべてのインスタンスはこのテンプレートに基づいて作成されます。

したがって、「new」キーワードを使用してオブジェクトを作成すると、実際には「CarClass」のコピーが取得されます。

 

調査2:親の委任メカニズム

4つのローダー

実行プロセスを理解するためにアイデアの下でソースコードを表示する

ctrl + NClassLoaderを検索し、java.langの下のクラスを選択します

クラス(ctrl + F)を入力した後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;
        }
    }

クラスの読み込みプロセス

フィギュアは上下、左、そして実行されます


親の委任メカニズム

1.同じものが繰り返しロードされないようにし.classます。委託して上記を依頼してください。一度ロードすると、再度ロードする必要はありません。データのセキュリティを確保します。
2.コア.classが改ざんされていないことを確認します。委任方式により、コアが改ざんされることはなく、改ざんされて.clasもロードされず、ロードされても同じ.classオブジェクトにはなりません異なるローダーは、同じオブジェクトで.classはなく同じClassオブジェクトをロードします。これにより、Class実行の安全性が保証されます。

サンドボックスの分離が目標であり、親の委任が実現です。

この図から、java、javax、sunなどのパッケージ(java.lang.Object、java.lang.Stringなど)の下のクラスがすべてスタートアップクラスローダーによってロードされていることがわかります。これらのクラスはパッケージ化する必要はなく、同じパスで同じ名前のクラスを作成すると、ロードできません。

 

 

 

 

++++++++++++++++++++++++++++++++++++
+ご不明な点がございましたら、+ Q:1602701980で話し合ってください。 +
++++ ++++++++++++++++++++++++++++++++

おすすめ

転載: blog.csdn.net/shenyuye/article/details/108063087