Java仮想マシン(10)--オブジェクト向け、oop-klassモデル
。
, , , 。
Javaプログラムの互換性処理方法:
ステージ
しょりモード
かいはつ
どのプラットフォームでも、下位プラットフォームの違いを特別に処理する必要はありません.Javaは統一的なファイルアクセス、メモリ申請、スレッド操作、GUI開発などのインタフェースを提供します.
コンパイル
異なるプラットフォームで、異なるJDKコンパイルをインストールする
梱包する
統合コマンドによるパッケージ化
うんてん
jvmをインストールすれば実行でき、他のdllやsoに依存しない
( ), 。
, , 。
Java , , , 。
。
以上のニーズ,およびトレンドに基づいて,Javaはオブジェクト向けの言語として設計されている.
jvm内部のJavaオブジェクトの表現モデルはoop-klassモデルである.
Hotspot仮想マシンは、Javaのクラスとオブジェクトを表すために内部で2つのクラスを使用します.
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という二分モデルを自然に進化させた.