投稿者: https://blog.csdn.net/luanlouis/article/details/40043991
ステップ1. JVMアプリケーション固有のメモリサイズのためのJVMのメモリの構成要件は、
JVMは、その構成要件に応じて開始され、メモリを適用し、JVM仕様に従って実装されたメモリは、複数の領域に分割されます。
定義情報のすべてのクラスはメソッド領域にロードされます。
ステップ2.ブートクラスローダー・インスタンスを作成し、初期のシステムは、メモリ・ベースの方式エリア領域にロードされます。
優れたアプリケーションJVMのメモリ空間の後、JVMは、ブートストラップクラスローダ(ブートストラップクラスローダ)のインスタンスを作成し、ブートストラップクラスローダは、C ++言語を使用しています。
ブートストラップクラスローダ(ブートストラップクラスローダ)は(JVM仮想マシンレベルのクラスを実行するために必要な基本的なシステム)下{JRE_HOME}ジャーパッケージ構成および/ LIBを読み出し、システムは、その後、メソッド領域クラスにロードされる、などその上java.lang.Stringで、java.lang.Object上位と。
ステップ3.ランチャーJVMインスタンスランチャーを作成し、クラスローダのClassLoaderを取得します
この場合には、JVMは、仮想マシンのクラスメソッド呼び出しエリアにロードされたsun.misc.Launcher
静的メソッドを getLauncher()
取得するために sun.misc.Launcher
インスタンス。
ランチャー= sun.misc.Launcherのsun.misc.Launcher.getLauncher(); // 取得したJavaランチャー
のClassLoader launcher.getClassLoaderクラスローダ=(); // 使用するためにメモリにロードされたクラスローダのClassLoaderクラスを取得します。
//戻り値 AppClassLoader 例えば、AppClassLoaderは、その親ローダーとしてExtClassLoaderます。
sun.misc.Launcherはシングルトンデザインパターンを使用して JVM sun.misc.Launcher仮想マシンのインスタンスを1つだけ確実にするために、。 その内部ランチャは、それぞれ、2つのクラスローダ(クラスローダ)を定義し、そしてsun.misc.Launcher.ExtClassLoader sun.misc.Launcher.AppClassLoaderは、
(2つのクラスローダは、クラスローダを展開するために参照されます拡張クラスローダ)とアプリケーションクラスローダ(アプリケーションクラスローダ)。
メインクラスのクラスローダをロードするステップ4.クラスローダ
()メソッドは、我々は、クラスxxx.xxx.TestMainを書くときロードAppClassLoader続いて、launcher.getClassLoaderによってAppClassLoaderインスタンスを返します。
AppClassLoaderはxxx.xxx.TestMain.classをロードするときは、一定の情報のクラスを格納するための定数プール(定数プール)ボディ構造と呼ばれるクラス、クラスファイルの定義を見に行くでしょう。クラス内で宣言されたものを使用するクラスを表す定数プールCONSTANT_CLASS_INFOタイプ定数があります。クラスが正しく動作する.xxx.xxx.TestMain、最初にこれらのクラスがロード内で宣言することを保証することができなければなりません。したがって、これらのクラスのAppClassLoader最初はメモリにロードされています。
##親クラスローダ委譲モデル:--------
JVMクラス情報領域領域のメソッドがクラスローダに応じて分割され、各クラス情報をロードするための独自のクラスローダを保持し、
クラス・ローダは、対応するクラスに応じてJVMヒープをロードする(ヒープ)対応するクラスを作成する <T>、クラス情報がエントリにアクセスするために使用され表します
プログラムエントリとしてプログラムを実行するために、mainメソッドのメインクラスを使用してステップ5
ステップ6実行の方法が完了し、JVMは、メモリを解放し、破壊しました