Java仮想マシン(10)--オブジェクト向け、oop-klassモデル


	                       。
	        ,              ,    ,           。

Javaプログラムの互換性処理方法:
ステージ
しょりモード
かいはつ
どのプラットフォームでも、下位プラットフォームの違いを特別に処理する必要はありません.Javaは統一的なファイルアクセス、メモリ申請、スレッド操作、GUI開発などのインタフェースを提供します.
コンパイル
異なるプラットフォームで、異なるJDKコンパイルをインストールする
梱包する
統合コマンドによるパッケージ化
うんてん
jvmをインストールすれば実行でき、他のdllやsoに依存しない
                   (                ),               。

                           ,       ,         。

   Java       ,      ,           ,        。

                 。

以上のニーズ,およびトレンドに基づいて,Javaはオブジェクト向けの言語として設計されている.
jvm内部のJavaオブジェクトの表現モデルはoop-klassモデルである.
Hotspot仮想マシンは、Javaのクラスとオブジェクトを表すために内部で2つのクラスを使用します.
  • oop、クラスを記述するためのインスタンス情報
  • klassは、Javaクラスを記述するために使用され、jvm内部のJavaタイプ構造のピア
  • である.
    jvmから見れば,JavaクラスだけでなくJavaメソッドもオブジェクトであり,バイトコード定数プールもオブジェクトであり,すべてがオブジェクトである.Javaのデータ構造実装メカニズムは,コンパイラがバイトコードになり,実行期間が実現する.プラットフォーム間およびランタイムタイプ識別を実現するため、コンパイル期間ではデータ構造はサポートされません.
    Javaタイプとインスタンスオブジェクトの場合、jvm内部ではinstanceKlassとinstanceOpで表されます.
    たとえば、次のコードがあります.
    ClassA a=new ClassA();
    

    仮想マシンがこの行のコードを実行すると、まずClassAをperm領域(jdk 8ではメタデータ領域)にロードし、その後jvmはスタック領域に空間を開き、インスタンスデータを格納し、変数aはこのインスタンス参照を指す.メタデータ領域にロードすると、instanceKlassの形式で存在し、スタック領域にはinstanceOp(つまり変数aが指すメモリ領域)が格納される.
    すべてのoopオブジェクトは、oopDesc(jdk 8に変化がありますが、意味は同じです)から継承され、oopDescには2つのキー変数があります.markと_metadata. _markにはスレッド状態,同時ロック,GC世代情報などのメモリIDが格納されている.metadataは、このクラスを指すinstanceklassのアドレスを格納します.
    jvmはバイトコード中のクラスメタ情報を保存する必要があるため,oop−klassという二分モデルを自然に進化させた.