Javaの綿密な研究2jvm_2(インタビュー必要)

JVMクラスローディング機構

すべてのクラスファイルプログラムが起動し、プログラムは、1回の使用をロードしませんが、唯一のように、Javaのクラスローディング機構(クラスローダ)で必要なプログラムが動的にメモリにクラスファイルをロードするためにクラスファイルがメモリにロードされた後、別のクラスによって参照されます。だから、ClassLoaderクラスは、動的に使用しているメモリにファイルをロードするために使用されます。

VMメモリ、および検証を施し、調製、解像度、初期にロードされたクラスを記述するバイトのバイナリストリーム(すなわち、クラスファイル)、最終的に生成されたJava型が直接(すなわち、それらがチェックされ、修飾されている仮想マシンで使用することができますJVMクラスローディング機構であるクラスオブジェクトclinit法)が実行されてclinit。

JVMクラス3つのステップにロードし
、対応するクラスのバイトコードファイルを見つけること(ロード):負荷に。
接続:JVMに読み出したバイトコードファイルに対応した(リンク)。
初期化:応じてクラスアクションの初期化(イニシャライズ)。

二つは、JVMの道にJavaクラスをロード

Class.forNameの(「クラス名」);

実際には、輸送のこの方法は次のとおりです。Class.forNameの(classNameの、真の、ClassLoader.getCallerClassLoader ()) メソッドの
パラメータa:クラス名、クラスの名前をロードします。
二つのパラメータ:真、クラスが初期化されているかどうか(必要に応じて初期化)
三のパラメータ:クラスローダ、対応するクラスローダ

ClassLoader.laodClass(「クラス名」);

実際には、このアプローチは、搬送された:ClassLoader.loadClass(名前、偽の)メソッドの
パラメータ:名前、クラス名をロードする
パラメータ2:偽、クラスローダの後(リンクせず)に接続する必要性

二つのアプローチの違い

forName(「」)得られたクラスが初期化される完了
のloadClass(「」)得られたクラスがまだ接続されていない
一般的に、二つの方法の同様の効果は、クラスロードすることができます。
初期化されているプログラムは、クラスかどうかに依存している場合しかし、あなたはClass.forNameの(名前)アップを使用する必要があります。
以下のような:Class.forName(“com.mysql.jdbc.Driver”)メソッド呼び出しの後、彼は----ドライバがDriverManageerに登録駆動する静的コードブロックの実装、クラスが初期化されます。
あなたが対応する接続にDriverManagerを取得するために行くことができる前に、それは、クラスの初期化後、ドライブは、DriverManageerに登録されます。
私たちが使用している場合はClassLoader.loadClass(com.mysql.jdbc.Driver)リンクしていない、それを、より多くのクラスを初期化しません。
対応する登録は、あなたは確かにDriverManager対応する接続を介して取得することはできません、上記のドライバのDriverManagerに戻りません。

クラスローダJavaは、3つのデフォルトを提供します

1.BootStrapクラスローダは、クラスローダが起動
rt.jarの、resources.jar、charsets.jarなど:最上位のクラスローダは、コアJDKライブラリなどをロードするための責任があるのJavaクラスローダの階層です

2.Extensionクラスローダ拡張クラスローダ
すべてのデフォルトJAVA_HOME / JRE / libに/ EXT /ジャーヘッドによってロードされたJava拡張ライブラリをロードするための責任を負います。

3.Appクラスローダシステムクラスローダがある
ディレクトリ内のすべてのアプリケーションのクラスパスのjarファイルとクラスファイルをロードするための責任を負います。

デフォルトで提供されるJavaクラスローダ3に加えて、ユーザーはまた、必要な自分自身のClassLoaderを定義することができ、これらから継承されたカスタムクラスローダでなければならないjava.lang.ClassLoaderクラスもJavaが提供する二つの追加クラスローダ(ClassLoaderを拡張し、アプリケーションクラスローダ)を含み、それはJVMが開始とともに、ブートストラップクラスローダを起動し、JVMのカーネルに組み込まれ、C ++で書かれた基礎となる、通常のJavaクラスではないので内部が、ブートストラップクラスローダは、クラスローダから継承しない、責任はコアライブラリのロードを終えましたそして、設定し、拡張クラスローダのApp ClassLoaderクラスローダー。
分類クラスローダ

原理のClassLoaderロードされたクラス

各ClassLoaderインスタンスは、親クラスローダリファレンス(関係が含まれ、関係継承されない)、ビルトインクラスローダ(ブートストラップ上のClassLoader)なし親クラスローダ自体の仮想マシンを持っているが、他のクラスローダのために使用することができますの親クラスローダインスタンス。

クラスローダのインスタンスがクラスをロードする必要がある場合、それはクラスの前に人を検索しようと、最初のタスクは、親クラスローダによってそれに委ね、このプロセスは、まず最上位で、上から下に検討されます得るためにロードされていない場合はロードしようとしたクラスローダーのブートストラップクラスローダにロードされていない場合に負荷がない場合、ロードしようとしている拡張クラスローダにタスクをつけ、その後は、ロードするためにAppClassLoaderに転送し、その後、打ち上げ委員会に戻りましたそして、指定されたファイルシステムへそれから、他の人やクラスをロードするURLをネットワーク。
彼らはこのカテゴリーにロードされていない場合は、ClassNotFoundExceptionがスローされます。そうしないと、このクラスは、クラス定義を生成し、メモリにロードし、メモリにこのクラスのクラスインスタンスオブジェクトを返すでしょう。

なぜ親は、このモデルを委託しますか?
再びロードされた不要の子クラスローダがないとき父は、クラスをロードしたときに、繰り返し荷重がなくなるため。セキュリティ上の理由から、私たちは、あなたがこの委任モデルを使用しない場合、我々は常に動的にJavaのコアAPIが定義されて代わるカスタムString型を使用することができますので、非常に大きなセキュリティ上のリスクがあるだろう、と両親は委託、想像します文字列が既に起動時にブートストラップクラスローダ(Bootstrcpクラスローダ)によってロードされたための方法、あなたはJDKクラスローダを変更しない限り、そのユーザー定義のクラスローダは、文字列の負荷を書いたことはありません、このような状況を回避することができますデフォルトの検索アルゴリズムクラス。

JVMは、検索クラスでは、2つのクラスがどのように同じであるかを判断するのですか?
JVMクラスは、同じ2つのクラスの名前かどうかを判断するために、だけでなく、クラスローダの同じインスタンスをロードするかどうかを判断するだけではなく、2つが同じであるかどうかを判断します。のみ両方満たす場合には、JVMクラスは、これらの2つが同じであることを考えます。

より多くのクラスのロードを参照してください。

おすすめ

転載: www.cnblogs.com/cashew/p/11597651.html