JAva仮想マシンの動作メカニズム

4605 ワード

注:オリジナル作品、交流学習のために分かち合い、転載は出典を明記してください.
Java仮想マシン(Inside JVM)
クラスローダまたはクラスローダ
役割:Classバイトコードプログラムをメモリにロードする
class Singleton
 {
	 public  static int counter1;
	 public static int counter2 = 0;
	 private static Singleton singleton = new Singleton();
	 public Singleton() {
		 counter1++;
		 counter2++;
	}
	static   // 
	{
	 }
	 public static Singleton getInstance()
	 {
		 return singleton;
	 }
 }
public class MyTest {
	public static void main(String[] args) {
		Singleton singleton = Singleton.getInstance();
		System.out.println("counter1 = " + singleton.counter1);
		System.out.println("counter2 = " + singleton.counter2);
	}
}

印刷結果:
counter1 = 1
counter2 = 1
package com.supan.classload;
 class Singleton
 {
	 private static Singleton singleton = new Singleton();
	 public  static int counter1;
	 public static int counter2 = 0;// counter1 0( , )
	 public Singleton() {
		 counter1++;
		 counter2++;
	}
	 public static Singleton getInstance()
	 {
		 return singleton;
	 }
 }
public class MyTest {
	public static void main(String[] args) {
		Singleton singleton = Singleton.getInstance();
		System.out.println("counter1 = " + singleton.counter1);
		System.out.println("counter2 = " + singleton.counter2);
	}
}

印刷結果:
counter1 = 1
counter2 = 0
メンバー変数の定義の順序が異なるだけで、結果は異なります.以下に説明します.
1,java仮想マシンとプログラムのライフサイクル
Java仮想マシンは、次のような状況でライフサイクルを終了します.
1,Systemを実行する.exit()は0を返すと正常終了を示し,そうでなければ異常終了(abnormal,変態,異常)終了を示す.
2,プログラム正常正常実行完了
3、プログラムは実行中に異常またはエラーに遭遇して異常終了する.つまりtry catchを使わないとプログラムが
異常はmainメソッドに次々と投げ込まれ、jvmの異常終了を招く
4、オペレーティングシステムのエラーによるjava仮想マシンの終了
 
2、クラスのロード、初期化へのリンク
≪ロード|Load|emdw≫:クラスのバイナリ・データを検索してロードします(classファイルをメモリに実装できます).
リンク:
検証:ロードされたクラスの正確性を確認します.(悪意はjavacを用いずにclassファイルを手動で生成するために使用されます)
準備:クラスの静的変数にメモリを割り当て、デフォルト値に初期化します.
解析:クラスのシンボル参照を直接参照に変換します.
初期化:クラスの静的変数に正しい初期値を与えます.
  
3,javaプログラムによるクラスの使い方は2つに分けられます
アクティブな使用
パッシブ使用
すべてのjava仮想マシン実装は、各クラスまたはインタフェースがjavaプログラムによって「最初にアクティブに使用」されたときに初期化する必要があります.
アクティブに使用する6つの方法:
1,クラスのインスタンスを作成する:newインスタンス
2、クラスの静的変数にアクセス
3,呼び出しクラスの静的メソッド
4,反射Class.forName("com.mysql.jdbc.Driver")
5,クラスのサブクラスを初期化する
6,java仮想マシンの起動時に起動クラスとして表示される
上記の6つのケースを除いては受動的に使用されています.クラスの初期化は起こりません.
   
4,クラスのロード
クラスのロードとは、クラスをロードすることを指す.classファイルのバイナリデータをメモリに読み込み、実行時データ領域に配置
のメソッド領域内で、スタック領域にjavaを作成します.lang.Classオブジェクト、メソッド領域内のクラスのデータ構造をカプセル化するために使用
クラスのロード方法:
1、ローカルシステムから直接ロード
2,インターネット経由でダウンロードする.classファイル(URLClassLoadでロード)
3,zip.JArなどのアーカイブファイルにclassファイルをロード
4、専用データベースからclassファイルを抽出する
5,javaクラウドファイルをclassファイルに動的にコンパイルする
  
  
5.クラスにロードされた最終製品はヒープ領域にあるClassオブジェクトである
Classオブジェクトはメソッド領域内のクラスのデータ構造をカプセル化し、javaプログラマにアクセス方法を提供します.
ゾーン内のデータ構造のインタフェース
  
  
6,2種類のクラスローダ
1,java仮想マシンに付属のローダ
ルートクラスローダバー(Bootstrap)はc++で書かれていて、このクラスは入手できません
拡張クラスローダ(Extension)javaで書かれた
システムクラス・ローダ(System)は、アプリケーション・ローダがjavaで書かれたものとも呼ばれる
2,ユーザカスタムクラスローダ
すべてjavaです.lang.ClassLoadのサブクラス
ユーザーはクラスのロード方法を定義できます.各クラスのオブジェクトには、クラスを定義するClassLoadが含まれています.
を行ないます.このクラスがルートクラスローダによってロードされている場合、このクラスのgetClassLoadメソッドは返されます.
のはnull
     
7、クラスローダは、クラスが「最初にアクティブに使用」されるまでロードする必要はありません.jvm仕様
クラスローダがクラスが使用されると予想されるときに事前にロードすることを許可し、guochengが再ロードされると
クラスローダは、classファイルが欠落しているか、エラーが発生した場合、プログラムでクラスを最初にアクティブに使用する必要があります.
時報告エラー(LinkageErrorエラー)
このクラスがプログラム中東で使用されていない場合、ローダはエラーを報告しません.
8,異なるjdkでコンパイルされた同じclassファイルは、異なるファイルであり、LinkedageErrorが現れる可能性がある
9,クラスの検証の内容
クラスファイルの構造チェッククラスファイルの構造チェッククラスファイルの構造チェッククラスファイルがjavaクラスファイルの固定格に従うことを確保する
意味チェック:クラス自体がjava言語の構文規定に合致していることを確認します.
バイトコード検証:
バイナリ互換性の検証
例:
package com.supan.classload;
public class MyTest {
	public static void main(String[] args) throws Exception {
		Class classzz = Class.forName("java.lang.String");
		System.out.println(classzz.getClassLoader());
		c c = new c();
		System.out.println(c.getClass().getClassLoader());
	}
}
class c 
{
}

印刷結果:
null
sun.misc.Launcher$AppClassLoader@1372a1a
Stringクラスがルートクラスローダによってロードされていることを示すcクラスは、システムクラスローダによってロードされている.