JVMは、構造物へのリンクで実行されるJavaプログラムから調製しました
1.java Javaのフロントエンドコンパイラは、バイトコードへのソースコードをコンパイルするための責任がある - >コンパイラのフロントエンド
2.java仮想マシンは、内部にコンパイル積載バイトコードに責任がある - >動作領域とクラスのJavaをロードするステップ
クラスのロード:ロードされ、リンク初期化
クラスローダ
親委譲モデル
親委任モデル(親委任モデル):
ロードクラスは、より優れたJavaプラットフォームの安全性を確保することができ、親委託機構がかかります。
このモデルは、ほかのトップブートストラップクラスローダのブートクラスローダを要求する、クラスローダの残りの部分は、それ自身を持っている必要があります父类加载器
。子どもと親クラスローダクラスローダが不是以继承(Inheritance)的关系
達成されていますが、によって组合(Composition)关系
親ローダーとコード多重。各クラスローダは、ローダの独自の名前空間を(持っているし、すべての親クラスローダが同じ名前空間のクラスをロードし、クラス名)のパッケージを含む(同じように完全な表示されません。 2つのクラスは、異なる名前空間に、)同じクラスの2つ(のパッケージを含む)完全なクラス名があるかもしれません
両親は、次のようにプロセスモデルがある委任することができます。
1.すでに直接元既にロードされたクラスにロードされた場合などは、ロードされた彼の、すでにロードされたクラスから現在のClassLoader最初のクエリを行います。
每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存, 等下次加载的时候就可以直接返回了。
2.現在のクラスローダは、同じ戦略を使用して、親クラスローダは、まず、そのキャッシュをチェックし、負荷に親クラスの親クラスを委任負荷に親クラスローダの委託を受け、キャッシュロードしたクラスでは見られない、となっていますブートストラップのクラスローダに。
すべての親クラスローダがロードされ、その後、現在のクラスローダによってロードされ、独自のキャッシュに配置されていない3.ので、次回に直接ロード要求リターンがあります。
クラスローダとの関係を整理するために、このモデルを使用する利点:
主にするために安全性
動的にするだけでなく、避けるために、Stringなど、いくつかのコアクラスを置き換える、ユーザー作成のJavaクラスを避ける重复加载
JVMだけでなく、異なるクラスを区別するため、それはちょうど、クラス名に基づいて2つの異なるクラスがロードされ、同じクラスファイルに異なるクラスローダは、相互変換場合、java.lang.ClassCaseExceptionがスローされます。
カスタムクラスローダ
3.最後に解釈/対応するプラットフォーム上で実行されるマシン命令にコンパイル - > JVM実行エンジンとガベージコレクションGC
Javaバイトコードは、実行される次の2つの方法で、
1時間コンパイラ方法:マシンコードに最初インタプリタバイトコードコンパイラを、その後、マシンコードを実行します。
2.解釈実行モード:インタプリタ解釈して実行することにより、コードの各部分は、Javaバイトコードプログラムのすべての操作を実行します。
JDKとOpenJDKのHotSpot VMのデフォルトである仮想マシンが付属しています。ホットスポットVM内では、インタイムコンパイラやインタプリタが共存します。これは、ある仮想マシンをパワーオンしたとき、インタプリタは、実行前にすべてが完全コンパイルするコンパイラを待たずに、最初に自分の仕事を行うことができますので、不要なコンパイル時間を大幅に節約することができます。以上のプログラムの実行時間、徐々に機能へのコンパイラ、プログラムの実行の高効率化と引き換えにネイティブのマシン命令にコンパイルされた値(頻繁に呼び出されるメソッド)のバイトコードに応じてホット検出機能。