JVMクラスローダ委譲モデルは、プロセスや両親を説明します

JVMクラスローダ委譲モデルは、プロセスや両親を説明します

この記事では、プロセスを説明し、JVMクラスローダ委譲モデルは、詳細な親を、クラスローダがクラスファイルの完全修飾名を指定することで、JVMのメモリにロードされ、その後、ベースのオブジェクトクラスに変換します。困っている友達を参照することができます

JVMの主要部分

  • クラスローダ(クラスローダー)
  • ランタイムデータ領域(ランタイムデータ領域)
  • 実行エンジン(実行エンジン)
  • ローカルライブラリインタフェース(ネイティブインタフェース)

構図JVMランタイムデータ領域

メソッドのエリア:

主に仮想マシンを格納するために使用される方法①領域は、ロードされたクラス情報(コンストラクタ、インタフェース定義)、定数、変数、およびそのような実行時定数プールなどの静的なデータとなっています。

②領域であるスレッドで共有されているのを。

方法③は、基準シンボルを生成するために、リテラルおよび静的コンパイラを記憶するためのゾーンの実行時定数プールを有しています。定数プールが実行される定数プールの一定のプレゼンスを生成、コンパイル時に決定され、必ずしも一定ではなく動的です。

仮想マシンのスタック:

また、仮想マシンのスタックのスタックメモリとして知られ、スレッドが作成されたときに、が作成されたJavaプログラムを実行しているを担当して、その寿命がスレッドに従うことを生涯で、存在していないガベージコレクションの問題のためにスタックメモリの終わりをリリースする予定のスレッド、限り、それはオーバー、ライフサイクルと同じスレッドは、スレッドがプライベートであるとして、スタックの一方の端を通します。

+ +インスタンスメソッドオブジェクト参照変数の変数の8つの基本タイプは、スタックメモリ割り当て関数です。

①各メソッドは、実行時のスタックフレーム、情報を格納するためのローカル変数テーブル、オペランドスタック、およびダイナミック・リンク・エクスポートする方法を作成します。

②仮想マシンのスレッドスタックは、そのライフサイクルと同じスレッドプライベートです。

ローカル変数テーブルは、オブジェクトの開始アドレスへのポインタが存在し得ることを基本データ型、RETURNADDRESS型(バイトコード命令のアドレスを指す)、およびオブジェクト参照は、オブジェクト参照に格納された③、オブジェクトハンドルが表すことができますオブジェクトまたは位置に関連します。4.メモリは、コンパイラの間で定義されたローカル変数のスペースを必要としました。

④インデックステーブルによってアクセスされるローカル変数は異なる演算のオペランドと結果を格納するオペランドスタックの主な機能、が、プッシュとポップ方法

⑤各スタックフレームは、支持動的リンク処理にこの参照メソッドを保持するスタックフレームに関連する方法の実行時定数プールへの参照を含むと呼ばれるダイナミックリンクは、実行時に記号定数プール参照にされ直接参照に。

ネイティブメソッドスタック

ネイティブメソッドスタックおよびスタックの仮想マシンは、ネイティブメソッドスタックのネイティブメソッドのサービスを除き、同様です。

ヒープ

Javaのヒープメモリのすべてのスレッドで共有されている仮想マシンが起動されたときに、ほぼすべてのオブジェクトインスタンスがここで作成されて作成され、この領域は、ガベージコレクションが発生することが多いです。

プログラムカウンタ

小さなメモリ空間、ニーズがバイトコードインタプリタの作業を実行するとき、バイトコード命令カウント値が選択されてもよい変える分岐、ループ、分岐、例外処理、およびリカバリ機能により、スレッドは、このカウンターの完了に依存する必要があります。メモリ領域は、任意の領域のOOM(アプリケーション・プログラム・メモリが大きすぎると、仮想マシンは、私たちを満たすことができない、その後自殺)ケースを指定していないだけで、Java仮想マシン仕様です。

仮想マシンでのプログラムの実行

まず、クラスファイルをロードするクラスローダは、メソッド領域(クラス情報(コンストラクタ、インタフェース定義)、定数、変数、およびそのような実行時定数プールなどの静的データ)に、クラステンプレートを取得し、オブジェクトのクラステンプレートをインスタンス化するために応じてヒープ上のオブジェクトは、メソッドを呼び出すときに、オブジェクトに応じて(ヒープが世代別ガベージコレクションのポリシー、ガーベジコレクションのアルゴリズム、メモリリークの理由を挙げることができる)になるとき、この方法は、スタック(8つの基本タイプの中に押し込まれます可変+オブジェクト参照変数+インスタンスメソッド)、ネイティブメソッドは、ネイティブメソッドスタックに押し込まオペレーティングシステムに実行エンジンコマンドによって解釈JVMによってオペレーティングシステムに命令を送信する、オペレーティングシステムがで、ネイティブメソッドインタフェースを呼び出しネイティブメソッドライブラリは、ローカルメソッドを実行します。スレッドの彼らの完全な実行が解放されると、スタック内のスタックをする方法を指摘するプログラムカウンタによるLIFOスタックの順にスタックする方法は、何のガベージコレクションではありません。

親クラスローダ委譲モデル

最初のクラスローダの下では、親委任モデルを導入する前に。任意のカテゴリについて、あなたはそれがJVMで一意でクラスローダとクラス自体によって確立されたロードする必要があり、各クラスローダは、別のクラスの名前空間を持っています。クラスローダは、クラスファイルの完全修飾名は、JVMのメモリにロードされ、その後、ベースクラスのオブジェクトに変換される指定することです。

クラスローダカテゴリ:

ブートクラスローダー JAVA_HOME / lib /ディレクトリをロードするために、仮想マシン自体の一部である、または-Xbootclasspathパラメータによって(ブートストラップクラスローダ)は、パスと仮想マシンの識別ライブラリによって特定されます。

拡張クラスローダ(拡張クラスローダ):ロードする責任 .. \ Libの\ extディレクトリまたはパスdirsのすべてのライブラリで指定されたJavaのextシステム変数。

アプリケーションクラスローダ(アプリケーションクラスローダ)。指定されたライブラリ上でユーザクラスパス(クラスパス)をロードするための責任は、我々が直接このクラスローダを使用することができます。一般的に、我々は、カスタムクラスローダーのデフォルトを持っていない場合、ローダを使用することです。

カスタムクラスローダ

示されているように、それらの間のトップダウンの関係です。

クラスローダの負荷がクラスが要求を受信した場合、それは自分の最初のクラスをロードするためにはありませんが、そう、すべてのことを、各レベルのクラスローダが真で完了するために、親クラスローダにこの要求を委任しますあなたは、要求がトップに転送されますクラスローダがロードを開始したときに、親ロードがロード要求を完了しない場合にのみ、(その検索に必要なクラスを見つけられませんでした)、その後、クラスをロードするために、サブローダーの試みから失望。

インタビューの質問:

独自のコードでは、java.lang.Stringオブジェクトを作成することができますか?オブジェクトは、クラスローダにロードすることができるかどうか、もしそうなら?
それは作成できますが、にロードすることはできません。

両親の代理人モードは、ブートストラップ(起動クラス)ローダー負荷がロードされないことを決してクラスのカスタムをjava.lang.Stringで、java.lang.Stringクラスの内側をjdkされる負荷クラスの親クラスローダことを保証しますので

おすすめ

転載: www.cnblogs.com/XtsLife/p/12079752.html