JVMの研究ノート()クラスローディング機構とクラスローダ

中国の旧正月のサプリメントJVMの下の知識が、私はいくつかの注意、ブログに別て送信した後1、間違っては伝えるためにJVMの下でコンパイルされた知識、良いとタイムリーな変更を行いました。

1. JVMはじめに

公式サイト

JVMは、Java仮想マシン(Javaのある仮想マシンの略称)、JVMは、架空のコンピュータであるコンピューティングデバイス、のコードは、様々なコンピュータ実現される機能の実際のコンピュータシミュレーション上を通過されます。

Java仮想マシン語を導入した後、Java言語は、ときに、異なるプラットフォーム上で実行するために再コンパイルする必要はありません。そのJava言語のことを、特にシールドのプラットフォームに関連付けられているJava言語情報を使用して、Java仮想マシンのコンパイラ単にオブジェクト・コードを生成するには、(Java仮想マシン上で実行されているバイトコード)、複数のプラットフォーム上で変更することなく実行することができます。

 

クラスローダサブシステム、ランタイムデータ領域、実行エンジン、ネイティブメソッドインタフェースとガーベジコレクションモジュール:Java仮想マシンは、5つのモジュールに分割されます。

2.クラスローディング機構

2.1ロード(読み込み)

クラスファイルを検索し、インポート

  1. バイナリバイトストリームのようにAクラスの完全修飾名で定義されます

  2. これは、ランタイムデータ構造領域法に静的記憶構造のバイトストリームを表します

  3. このクラスのJavaヒープの代表生成java.lang.Classオブジェクト、データ入力エリアにアクセスする方法を

2.2リンク(リンク)

2.2.1検証(検証)

クラスの正確さを確保するためにロードされ、

  • ファイル形式の検証

  • メタデータの検証

  • バイトコード検証コード

  • シンボリック参照の検証

2.2.2準備準備

静的クラス変数(静的変数変更されたフィールド)は、メモリを割り当て、それがデフォルト値に初期化します。

インスタンス変数を一緒に持つオブジェクトに割り当てられているのに対し、最終的にコンパイル時に割り当てられ、割り当てインスタンス変数に存在初期化されないことに注意されるので、ここでは、静的の最終変更に含まれていない、クラス変数は、メソッド領域に割り当てられていますJavaヒープ。

2.2.3解決さ(解像度)

シンボリック定数プール参照は直接参照に変換されます。

シンボリック参照は、任意のリテラルであることができるターゲットを記述するためのシンボルの集合です。

直接参照は、間接的または測位対象ハンドルに対してオフセット、オブジェクトへの直接のポインタです。

そこに、クラスまたはインタフェースを解析するフィールドを解析、クラスメソッドを解析し、インターフェース方法の分解能は、(ここで参照変数のバイトコードに関する。

 

2.3初期化(イニシャライズ)

静的クラス変数、静的コードブロックを行う初期化動作(割り当て)

2.4クラスローディング機構は示され

 

3.クラスローダ(クラスローダー)

完了するために、クラスローダのニーズによって、バイナリバイトストリームを定義するクラスの取得完全な名前で定義されているロード(負荷)相は、定義により、クラスファイルをロードするために使用されます。

3.1分類

  • ブートストラップスタートクラスローダがロード$ JAVA_HOMEのjre / libに/ rt.jarの責任があります

  • 拡張拡張クラスローダは、$ JRE / libに/ *。ジャージャーでJAVA_HOMEまたは-Djava.ext.dirsパッケージディレクトリを指定したなど、いくつかの機能のjarパッケージを、延長積載Javaプラットフォームを担当しています。

  • アプリケーションシステムクラスローダーは、指定されたとjarとjarパッケージDjava.class.pathクラスのディレクトリを指定したクラスパスをロードする責任があります。

3.2には、クラスローダを示しています

 

3.3委任両親メカニズム

定義:親クラスローダ場合は、クラスをロードするクラスローダ場合は、要求に応じて、それは最初に自分のクラスをロードしようとしませんが、完了するために、親クラスローダにこのタスク要求を委託する、再帰的に続きますクラスのロードは返すタスクを正常に完了することができ、親クラスローダは、このタスクの負荷を完了できないときにのみ、それ自体をロードします。

長所

それをロードしたクラスローダと一緒にJavaクラスは、優先度の関係を持っています。例えば、このクラスをロードするクラスローダ方rt.jar内の格納されているオブジェクトクラス、内のJavaは、最終的に負荷にブートクラスローダーの上部にモデルに割り当てられ、したがって、オブジェクトの様々なさクラスローダ環境は同じクラスです。両親は委任モデルを使用しない場合は、自分自身の負荷にクラスローダ個人が、その後、別のシステムオブジェクトクラスの数があるでしょう。

破坏:可以继承 ClassLoader 类,然后重写其中的 LoadClass()。


When I let go of what I am , I become what I might be.
走出舒适圈,遇见更好的自己。


发布了91 篇原创文章 · 获赞 63 · 访问量 18万+

おすすめ

転載: blog.csdn.net/qq_38423105/article/details/104710065