TOP / Java仮想マシンの構造

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

実行を理解するには

VM Spec Loading, Linking, and Initializing



イバラキングへのリンク Get Firefox Valid XHTML 1.1 Apple Darwinへのリンク