JVM親委任メカニズム

序文

Javaクラスの読み込みは動的であり、一度にすべてのクラスを読み込んでから実行するのではなく、プログラムの基本クラス(基本クラスなど)がjvmに完全に読み込まれるようにします。他のクラスについては、ロードする前。もちろん、これはメモリのオーバーヘッドを節約するためです。

Java仮想マシンは、クラスファイルにオンデマンドロード方式を採用しています。つまり、クラスを使用する必要がある場合、そのクラスファイルをメモリにロードしてクラスオブジェクトを生成します。また、特定のクラスのクラスファイルをロードすると、Java仮想マシンは親委任モードを採用します。つまり、要求はタスク委任モードである親クラスによって処理されます。
 
クラスローディングには2つのタイプがあります。
  • 暗黙的なロード。プログラムが操作中にnewおよび他のメソッドによって生成されたオブジェクトに遭遇すると、対応するクラスをjvmにロードするためにクラスローダーが暗黙的に呼び出されます。
  • class.forname()およびその他のメソッドによる明示的な読み込み、必要なクラスの明示的な読み込み
 
なぜこれを行うのですか?
親委任モデルを使用せず、各クラスローダーによってロードした場合、ユーザーがjava.lang.Objectというクラスを作成してプログラムのClassPathに配置すると、システムには複数の異なるオブジェクトが存在します。クラス、Java型システムの最も基本的な動作は保証できません。アプリケーションもめちゃくちゃになります。
 
委任メカニズムの意味
同じバイトコードの複数のコピーがメモリに表示されないようにする
たとえば、クラスAとクラスBの両方がシステムクラスをロードする必要があります。
コミッショニングなしで独自のものをロードすると、クラスAはシステムバイトコードのコピーをロードし、クラスBはシステムバイトコードのコピーをロードして、システムバイトコードの2つのコピーがメモリに表示されるようにします。
委任メカニズムを使用する場合は、親クラスを再帰的に検索します。つまり、Bootstrapを使用してロードを試み、見つからない場合は下に移動します。ここのシステムは、Bootstrapで見つかり、ロードされます。このときにクラスBもSystemをロードする必要がある場合、システムもBootstrapから開始します。この時点で、Bootstrapはシステムがロードされていることを検出し、リロードせずにシステムをメモリに直接返します。 、メモリにシステムバイトコードのコピーが1つしかないようにします。
 
自分でjava.lang.Systemというクラスを作成できますか?
回答:通常はそうではありませんが、この要求を満たすために別のアプローチをとることができます。 
説明:Systemクラスを作成できないようにするために、クラスのロードは委任メカニズムを使用します。これにより、親クラスローダーが優先され、親クラスローダーが検出できるクラスは、子ローダーにロードされることはありません。Systemクラスは、Bootstrapローダーによって読み込まれます。それ自体で書き換えられても、常にJavaシステムが提供するSystemを使用します。それ自体で記述されたSystemクラスは読み込まれません。
ただし、この目的を達成するためにクラスローダーを定義できます。親の委任メカニズムを回避するには、このクラスローダーも特別である必要があります。システムに付属する3つのクラスローダーはすべて特定のディレクトリにクラスをロードするため、独自のクラスローダーを特別なディレクトリに配置すると、システムローダーをロードできません。つまり、最終的には独自のロードになります。ローダー。

 

動作原理
(1)クラスローダーがクラスロード要求を受け取った場合、最初にそれをロードするのではなく、要求を親クラスローダーに委任して実行します。
(2)親クラスローダーがまだ親クラスローダーを保持している場合、さらに上位に再帰的に委譲され、要求は最終的にトップレベルのスタートアップクラスローダーに到達します。
(3)親クラスローダーがクラス読み込みタスクを完了できる場合は正常に戻り、親クラスローダーが読み込みタスクを完了できない場合は、子ローダーがそれを単独でロードしようとします。
 
 

 

おすすめ

転載: www.cnblogs.com/caoxb/p/12735527.html