ホームページ  >  記事  >  Java  >  JVM からの Java クラスのロードおよびアンロード メカニズムの分析

JVM からの Java クラスのロードおよびアンロード メカニズムの分析

高洛峰
高洛峰オリジナル
2017-01-13 09:35:511302ブラウズ

JVM からの Java クラスのロードおよびアンロード メカニズムの分析

クラスロード
クラスロードとは、クラスの.classファイル内のバイナリデータをメモリに読み込み、ランタイムデータ領域のメソッド領域に配置し、ヒープ領域にJavaを作成することを指します。 .lang.Class オブジェクトは、メソッド領域内のクラスのデータ構造をカプセル化するために使用されます。

.class ファイルをロードする方法:

1. ローカル システムから直接ロードします

2. ネットワーク経由で .class ファイルをダウンロードします

3. zip、jar、その他のアーカイブ ファイルから .class ファイルをロードします

4. From 独自のデータベースから .class ファイルを抽出します

5. Java ソース ファイルを .class ファイルに動的にコンパイルします

クラスロードの最終生成物は、ヒープ領域に配置される Class オブジェクトです。

Class オブジェクトは、メソッド領域のクラスのデータ構造をカプセル化し、メソッド領域のデータ構造にアクセスするためのインターフェイスを Java プログラマに提供します。

JVM からの Java クラスのロードおよびアンロード メカニズムの分析

クラスローダー
ローダーには2種類あります:

1. Java仮想マシンに付属するローダー

ルートクラスローダー(Bootstrap)

拡張クラスローダー(Extension)

システム クラス ローダーまたはアプリケーション ローダー (システム)

後の 2 つのローダーは Java で実装されており、ルート クラス ローダーは C++ で記述されており、プログラマはこのクラスを Java コードで取得できません。

2.ユーザー定義のクラスローダー。

JVM 仕様では、クラスローダーが使用されることが予想されるときにクラスをプリロードすることが許可されています。.class ファイルが見つからない場合、またはプリロードプロセス中にエラーが発生した場合、クラスローダーはクラスを初めてアクティブに使用する必要があります。エラー (LinkageError) は、エラーが発生した場合にのみ報告されます。クラスがプログラムによってアクティブに使用されていない場合、クラス ローダーはエラーを報告しません。

クラスアンロードメカニズム

クラスライフサイクル

Sampleクラスがロードされ、接続され、初期化されると、そのライフサイクルが始まります。

Sampleクラスを表すClassオブジェクトが参照されなくなる、つまりアクセスできなくなると、Classオブジェクトはライフサイクルを終了し、メソッド領域内のSampleクラスのデータもアンロードされ、 Sample クラスのライフサイクル。

クラスがいつライフサイクルを終了するかは、それを表す Class オブジェクトがいつライフサイクルを終了するかに依存することがわかります。

参照関係

ローダーとクラス オブジェクト:

クラス ローダーの内部実装では、ロードされたクラスへの参照を保存するために Java コレクションが使用されます。

一方、Class オブジェクトは常にそのクラス ローダーを参照します。 Class オブジェクトの getClassLoader() メソッドを呼び出して、そのクラス ローダーを取得します。


Class インスタンスとそれをロードするローダーとの間には双方向の関係があることがわかります。

クラス、クラスのクラスオブジェクト、クラスのインスタンスオブジェクト:

クラスのインスタンスは常に、このクラスを表す Class オブジェクトを参照します。

getClass()メソッドはObjectクラスに定義されており、このメソッドはオブジェクトが属するクラスを表すClassオブジェクトへの参照を返します。

さらに、すべての Java クラスには静的属性クラスがあり、このクラスを表す Class オブジェクトを参照します。

クラスのアンロード

Java 仮想マシンに付属のクラス ローダーによってロードされたクラスは、仮想マシンのライフ サイクル中にアンロードされることはありません。

前に紹介したように、Java 仮想マシンに付属するクラス ローダーには、ルート クラス ローダー、拡張クラス ローダー、システム クラス ローダーが含まれます。

Java仮想マシン自体は常にこれらのクラスローダーを参照し、これらのクラスローダーはロードするクラスのClassオブジェクトを常に参照するため、これらのClassオブジェクトには常に到達可能です。


ユーザー定義のクラスローダーによってロードされたクラスはアンロードできます。

具体例

loader1 変数と obj 変数は Sample クラスを表す Class オブジェクトを間接的に適用し、objClass 変数はそれを直接参照します。

プログラムの実行中に、上の図の左側にある 3 つの参照変数がすべて null に設定されている場合、Sample オブジェクトはそのライフ サイクルを終了し、MyClassLoader オブジェクトはそのライフ サイクルを終了し、Sample クラスを表す Class オブジェクトはSample クラスはライフサイクルを終了します。メソッド領域のバイナリデータはアンロードされます。

再度必要になった場合は、Sample クラスの Class オブジェクトが存在するかどうかを確認します。存在する場合は、再ロードせずに直接使用されます。Sample クラスが存在しない場合は、再ロードされて新しいクラスが生成されます。 Java仮想マシンのヒープ領域。SampleクラスのClassインスタンスを表します(ハッシュコードで同一インスタンスか確認できます)。

JVM からの Java クラスのロードおよびアンロード メカニズムの分析に関するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。