良いプログラマは、Java JVMルートの共有に関連する概念を学ぶために、JDK(Javaの開発キット)は、Java開発キットは、Java開発者の集合は、コンパイルやプログラムのデバッグのための手順のセットです。
JRE(JavaランタイムEvironment)は、Java Runtime Environmentは、Javaプログラムを実行するためのプラットフォームであり、すべてのJavaプログラムは、このプラットフォームで実行することができます。
JVM(Java仮想マシン)は、Java仮想マシン、コンピュータによって実行される機能をシミュレートするために使用される仮想コンピュータコードのうち、それのような、独自のハードウェアアーキテクチャを有する:等プロセッサ、スタックレジスタは、また、命令の独自のセットを有しています異なるオペレーティングシステム上のシステムは、JVMをインストールし、異なるオペレーティングシステム上で実行できるJavaプログラムを有効にすることができ、JVMは、Javaのクロスプラットフォームの機能を実現することです。
JVMクラスのロード処理
私たちはあなたをコンパイルして実行する必要があり、Javaプログラムの実行を開発し、JVMは、クラスのロード処理を担当しています。<BR>
クラスのロードプロセスがに分かれています。
1.ロード
2.確認してください
3.準備
4.決意
5.初期化
詳細なクラスのロード手順
これらの手続きの下で、次の詳細情報:
1.ロード<BR>
完了するために、クラスをロードするプロセスには:
1.修飾子クラスの完全な名前に基づいて、クラスのバイナリストリームを取得、ストリームは、ディスク上のクラスから取得したjarファイルは、また、ネットワークから取得することができますすることができます。
2.操作方法に領域の動的記憶構造静的ストレージクラス構造
、入口領域の方法に対応するのjava.lang.Classオブジェクトを生成するためのヒープメモリ3.
2. <BR>を確認します
クラスのロードが完了した後、以前のClassオブジェクトで生成された情報は、JVMの安全を危険にさらすしないことを保証し、検証プロセスを、入力します。<BR>
側面があることを確認する必要があります:
1.ファイル形式の検証は、仕様クラスバイトストリームファイルフォーマットの準拠を検証することで、仮想マシンの処理の現在のバージョンであることができます。マジックナンバーは、0xCAFEBABEかどうかを確認するために、メジャーおよびマイナーバージョン番号が現在の仮想マシンの処理範囲である等定数プール、一定サポートされていない一定のタイプが存在する場合、主な目的は、検証フェーズ入力バイトを確保することです後者の3つが基づいていることを検証フェーズメモリ領域の設定方法を行うように適切に解析し、処理領域に格納されたフローは、この段階で認証され、バイトストリームは、メモリ領域の格納方法に入ります。
2.メタデータ検証情報は、Java言語仕様を記述した情報の遵守を確保するために、バイトコード意味解析を説明しています。検証が含まれる:親クラスかどうか、このクラスの親が許可され継承されたクラスを継承するかどうか、クラスは抽象クラスではないかどうか、その親クラスまたはインタフェースの実装要件のすべてのメソッドを実装している場合。
3.バイトコード検証、主なタスクは、実行時にメソッドのバリデーションクラスは安全性を危険にさらす、仮想マシンの行為をすることはありません保証するために、データ・フローと制御フロー解析です。バイトコードメソッド本体は、クラスのバイトコード検証に合格しない場合、それは確かに問題です。しかし、バイトコード検証によって、メソッドの本体は、それが必ずしも安全で説明できない場合。
引用された直接参照に変換したときに前記基準シンボルを確認し、シンボルが仮想マシンで発生し、変換アクションは「分析フェーズ」で発生します。シンボリック参照クラス、フィールドおよびメソッド、対応するクラスを見つけることができれば命名機関を参照して説明検証記号列、メソッド指定されたフィールド記述子クラス名とフィールドの簡単な説明に準拠した方法があるかどうかと現在のクラスにアクセスできるかどうか、アクセシビリティ(プライベート、保護、公共、デフォルト)。
3. <BR>準備
準備フェーズは、メモリのような静的変数のメソッド領域に割り当てられたデフォルト値を代入します。
`` `
公共の静的なint型のカウント数= 100;
`` `
例えば:準備段階で上記カウント変数が0に割り当てられ、その後、初期化中に100に割り当てられます。
4.解決<BR>
ステージを解析すると、直接参照を交換するプロセスへのシンボリック参照の定数プールへの仮想マシンです。
- シンボリック参照(シンボリックリファレンス)<BR>
参照に記載されたシンボルの特定のセットへのシンボル参照、リテラルシンボルは、任意の形態であってもよく、限り目標を使用するように明確に位置付けることができます。シンボル参照は、仮想マシンを達成するためのメモリレイアウトとは何の関係もない、目標は必ずしもメモリにロードされた基準ではありません。
- 直接参照(直接参照)<BR>
直接参照は、ターゲットへの直接のポインタ、相対オフセットまたは間接的にターゲットを処理するために標的化され得ます。メモリレイアウトへの直接参照は、あなたが直接参照を持っている場合、対象の参照が既にメモリに存在している必要があり、仮想マシンの実装に関連しています。
5.初期化<BR>
クラス初期化クラスがロードプロセスの最終工程で、フロントローディング方式は、参加からクラスローダを定義するに添加することによって、残りの動作は完全に負荷段階の間、仮想マシン制御およびユーザ・アプリケーションによって支配されます。初期化フェーズに、実際にJavaコードで定義されたクラスを開始しました。<BR>
初期化フェーズは、クラスのコンストラクタ<clinit>()メソッド中に行われます。<Clinit>()メソッドは、すべてのクラスとの文のブロック(静的{}ブロック)を生成文をマージの静的変数のコンパイラクラス割り当て操作によって自動的に収集されます。
だから、ときの初期化にそれを実行するには?
1.クラスのインスタンスを作成します。
(修飾された最終的な定数を除く)。2.アクセスクラス静的変数
理由:定数、変数の特別な種類、コンパイラはプロパティ値ではなく、治療するとして扱いますので。
3.アクセスクラスの静的メソッド
前記リフレクタ(Class.forNameの( "com.test.Person"))
5.クラスを初期化すると、その親を見つける開始されていない、最初は親クラスの初期化を呼び出します
前記仮想マシンが起動すると、main()メソッドの定義は、クラスを初期化します
コードケース####
私たちは、顔の質問を見て、クラスローディング機構を理解します:
`` `
パブリッククラスMySingleton {
プライベート静的MySingletonシングルトン=新しいMySingleton();
公共の静的なint型COUNT1 = 0;
公共の静的なint型のCOUNT2。
プライベートMySingleton(){
COUNT1 ++;
COUNT2 ++;
}
パブリック静的MySingletonのgetInstance(){
シングルトンを返します。
}
パブリック静的無効メイン(文字列[] args){
MySingletonシングルトンMySingleton.getInstance =();
System.out.println( "COUNT1 - >" + MySingleton.count1)。
System.out.println( "COUNT2 - >" + MySingleton.count2)。
}
}
`` `
上記の結果は、学生の大半は、2つの静的変数が1であることがより事故の結果を考えることがあります。
`` `
COUNT1 - > 0
COUNT2 - > 1
`` `
これはなぜでしょうか?今、私たちは分析することがあります。
1.まず、我々は準備段階のクラスの静的変数のデフォルト値を割り当てます知っています。<br>
シングルトン= NULL;
COUNT1 = 0;
COUNT2 = 0;
2.静的メソッドは、クラスのgetInstanceを呼び出し、その後、新しいMySingleton()コンストラクタ呼び出しを実行し、初期化クラスをトリガします。<br>
COUNT1 = 1。
COUNT2 = 1。
3.値1を保持するために全く割り当てCOUNT2ない、COUNT1は0を割り当て、変数割り当てのための初期化を継続し、結果は次のとおり<BR>
COUNT1 = 0;
COUNT2 = 1。
####概要
JVMは、独自のハードウェアとソフトウェアで、コンピュータシミュレーションのコードで、JVMは、特定のロードプロセスをロードして実行するJavaクラスを有効にします:読み込み、検証、準備、分析、5つのステップを初期化します。