Java仮想マシンの構造
これは、The Java Virtual Machine Specification Second Editionを読んで、Java仮想マシンの構造を図解したものです。
#The pc Register -Thread毎にプログラムカウンタを持つ.(プログラムカウンタとは、今実行している行をさすカウンタのこと.) ---------- ---------- |Thread 1| |Thread 2| ..... |--------| |--------| |pc | |pc | |--------| |--------| ---------- ---------- #Java Virtual Machine Stacks -ThreadはプライベートなJava Virtual Machine Stackを持つ. ---------------- ---------------- |Thread 1 Stack| |Thread 2 Stack| ..... |--------------| |--------------| |--------------| |--------------| |--------------| |--------------| |--------------| |--------------| ---------------- ---------------- -実行時に、ローカル変数や実行結果を保持したり、メソッド呼び出しのポインタが格納されたりする. -load,store命令以外操作されない.(is never manipulated) -多分ヒープ領域として実装するが、Stack幅は固定でも変動でもかまわない. -例外としてStackOverflowError,OutOfMemoryErrorは強制実行される. #Heap -Threadで共有されるヒープ領域を持つ -ここには、実行時にインスタンスや配列がロードされる. -------------ヒープ ------------- |Threads shared | --------------------------------- -この領域はガベージコレクターで拡大縮小される. -例外としてOutOfMemoryErrorは強制実行される. #Method Area -Threadで共有されるメソッド領域を持つ -コンパイルされた実行コードが入る. -具体的には、クラスにつき、実行時コンテントプール、フィールド、メソッドデータ、メソッドやコンストラクタのコードが入る. ------------- メソッド領域 -------------------- -------------1クラス ------------ | ------------------------- | | | 実行時コンテントプール| | | ------------------------- | | ------------------------- | | |フィールド | | | ------------------------- | | ------------------------- | | | メソッド | | | ------------------------- | | ------------------------- | | | コード | | | ------------------------- | | | --------------------------------- ....クラス分 ----------------------------------------------- - Unixでいう"text"セグメントが格納される場所. #Runtime Constant Pool -クラスファイルのコンテントプール・テーブルを表す領域. - コンテント・プールとは、リテラル値やフィールドの参照先、メソッドの参照先が書かれているもの. - 一般的にはシンボルテーブルなどと呼ばれる. #Native Method Stacks -CなどのOS Nativeな関数などを呼び出すためのスタック. -これはあってもなくても仕様上はよい. -作る場合はスレッド毎に作る. -例外としてStackOverflowError,OutOfMemoryErrorは強制実行される. #Frames -メソッド呼び出し時に作られ、メソッド完了時に破棄される. -データの保持や結果の保持を行う. (例えば、ダイナミックリンク、メソッドの戻り値、例外ハンドリング) -フレームは、フレームを作るメソッドのJava virtual machine stackから割り当てられる.(つまりスタックとの結びつきがつよい.) -------------フレーム ----------- | ------------------------- | | | ローカル変数用配列 | | // ローカル変数の配列は0からのindexでアクセスされる. | ------------------------- | | ------------------------- | | |オペランドスタック | | // 引数やローカル変数、戻り値の処理に使う. | |-----------------------| | | |-----------------------| | | |-----------------------| | | ------------------------- | | | | ------------------------- | | | Dynamic Linking | | // メソッド実行コードやコンテント・プールの参照を格納. | ------------------------- | | | --------------------------------- ....クラス分
参考資料
構造を理解するには
VM Spec The Structure of the Java Virtual Machine
実行を理解するには
