JVMは、構造物へのリンクで実行されるJavaプログラムから調製しました

JVMは、構造物へのリンクで実行されるJavaプログラムから調製しました


1.java Javaのフロントエンドコンパイラは、バイトコードへのソースコードをコンパイルするための責任がある - >コンパイラのフロントエンド

2.java仮想マシンは、内部にコンパイル積載バイトコードに責任がある - >動作領域とクラスのJavaをロードするステップ

クラスのロード:ロードされ、リンク初期化

負荷 クラスローディング段階は、クラスの完全修飾名に応じて、バイナリバイトがJVM内を流れる読み取るためのクラスローダの責任である 、方法ゾーンにおけるランタイムメモリ領域に格納され、その後に変換ターゲット・タイプのjava.lang.Classオブジェクト・インスタンスに対応し、アクセス方法エントリ領域各種データクラスとして将来のクラスのオブジェクトになります。
リンクは JVMの動作状態への情報のバイナリデータのバイトストリームのクラスにJVMにロードされ 、接続認証による位相、および解析は三段階の構成を準備します。検証フェーズの主なタスクは、データは、JVM仕様を入力するかどうかを検証することです。準備フェーズの主なタスクは、すべての静的変数のクラスのためのメモリ領域を割り当て、および初期値を設定することです。段階解析すべてのシンボリック定数プールの参照は、すべての直接参照に変換されます。しかし、JVM仕様は、特定の順序に従って解決フェーズの実装を提供しないので、解像度の相を初期化後まで行うことができます。
初期設定 JVMは、クラス内のすべての再実行されたすべての静的コードまたはコード・ブロック識別されたキーワードになります。

クラスローダ


ブートストラップクラスローダはまた、ブートローダーになり、「JAVA_HOME / libに」ディレクトリのすべてのタイプをロードするための責任があります
「JAVA_HOME / libに/ extに」拡張ディレクトリをロードするためのすべてのタイプExternalClassLoader責任
すべての種類は、次のクラスパスをロードするための責任appClassLoader

親委譲モデル

親委任モデル(親委任モデル):

ロードクラスは、より優れたJavaプラットフォームの安全性を確保することができ、親委託機構がかかります。
このモデルは、ほかのトップブートストラップクラスローダのブートクラスローダを要求する、クラスローダの残りの部分は、それ自身を持っている必要があります父类加载器子どもと親クラスローダクラスローダが不是以继承(Inheritance)的关系達成されていますが、によって组合(Composition)关系親ローダーとコード多重。各クラスローダは、ローダの独自の名前空間を(持っているし、すべての親クラスローダが同じ名前空間のクラスをロードし、クラス名)のパッケージを含む(同じように完全な表示されません。 2つのクラスは、異なる名前空間に、)同じクラスの2つ(のパッケージを含む)完全なクラス名があるかもしれません

両親は、次のようにプロセスモデルがある委任することができます。

1.すでに直接元既にロードされたクラスにロードされた場合などは、ロードされた彼の、すでにロードされたクラスから現在のClassLoader最初のクエリを行います。

每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存, 等下次加载的时候就可以直接返回了。 

2.現在のクラスローダは、同じ戦略を使用して、親クラスローダは、まず、そのキャッシュをチェックし、負荷に親クラスの親クラスを委任負荷に親クラスローダの委託を受け、キャッシュロードしたクラスでは見られない、となっていますブートストラップのクラスローダに。
すべての親クラスローダがロードされ、その後、現在のクラスローダによってロードされ、独自のキャッシュに配置されていない3.ので、次回に直接ロード要求リターンがあります。

クラスローダとの関係を整理するために、このモデルを使用する利点:
主にするために安全性動的にするだけでなく、避けるために、Stringなど、いくつかのコアクラスを置き換える、ユーザー作成のJavaクラスを避ける重复加载JVMだけでなく、異なるクラスを区別するため、それはちょうど、クラス名に基づいて2つの異なるクラスがロードされ、同じクラスファイルに異なるクラスローダは、相互変換場合、java.lang.ClassCaseExceptionがスローされます。

カスタムクラスローダ

唯一の抽象ClassLoaderクラスを継承して書き直す必要 にfindClass ()メソッドをすることができます。クラスで使用されるクラスのインスタンスに読み込ま着信バイナリ配列に変換 defineClass ()メソッド。

3.最後に解釈/対応するプラットフォーム上で実行されるマシン命令にコンパイル - > JVM実行エンジンとガベージコレクションGC

 Javaバイトコードは、実行される次の2つの方法で、
  1時間コンパイラ方法:マシンコードに最初インタプリタバイトコードコンパイラを、その後、マシンコードを実行します。 
  2.解釈実行モード:インタプリタ解釈して実行することにより、コードの各部分は、Javaバイトコードプログラムのすべての操作を実行します。 

JDKとOpenJDKのHotSpot VMのデフォルトである仮想マシンが付属しています。ホットスポットVM内では、インタイムコンパイラやインタプリタが共存します。これは、ある仮想マシンをパワーオンしたとき、インタプリタは、実行前にすべてが完全コンパイルするコンパイラを待たずに、最初に自分の仕事を行うことができますので、不要なコンパイル時間を大幅に節約することができます。以上のプログラムの実行時間、徐々に機能へのコンパイラ、プログラムの実行の高効率化と引き換えにネイティブのマシン命令にコンパイルされた値(頻繁に呼び出されるメソッド)のバイトコードに応じてホット検出機能。



公開された159元の記事 ウォン称賛75 ビュー190 000 +

おすすめ

転載: blog.csdn.net/xuehuagongzi000/article/details/70054576