Integer Java Virtual Machineエミュレータ試作
作成者:森 考史
目次1. Java プログラムの実行
4. JVM について
3. IJVM(Integer Java Virtual Machine)
5. IJVM エミュレータの概要
6.まとめ
2.研究の目的と結果
Javaプログラム
Classファイルコンパイル
x86 SPARC
Java VM Java VMJava VM Java VM Java VM
SolarisLinux FreeBSD
MacOS Windows
Java VM
Solaris
Power PC
Java プログラムの実行
・ 命令セットが用意され、命令の実行時に様々な記憶領域の操作が行われる。
JVM (Java Virtual Machine)
Class ファイルCA FE BA BE 00 00 00 2E 2D 0A 00 0D86 A0 07 00 87 1E 0A 00
88 00 20 0A 89 22 0A 00.・・・・・・
・・・・・・
・・・・・・・・・・・・
JVMClass ファイルを読み込み、そこで指定された操作を正しく実行する。
JavaプログラムClass xx { public void xxx { ・・・・ ・・・・ ・・・・ }}
目次
2.研究の目的と結果
4. JVM について
3. IJVM(Integer Java Virtual Machine)
5. IJVM エミュレータの概要
6.まとめ
1. Java プログラムの実行
様々なアプリケーションにおいて1. JVM の各命令の使用頻度を取り、アプリケーション の性格によって差異が生まれるかどうかを調査する。
2. JVM の各命令が使用される順序や組み合わせに 規則性がないかを調査する。
JVM の各命令の使用頻度や使用順序を調べることができる JVM のエミュレータを作る
研究の目的と結果
Java の実行環境である JVM(Java Virtual Machine)をコストを少なく効果的に高速化させる
ための材料を探すこと本研究の成果物
JVM のエミュレータを作る足がかりとして、JVM のサブセットであるInteger Java Virtual Machineのエミュレータを作成した。
目次
2.研究の目的と結果
4. JVM について
3. IJVM(Integer Java Virtual Machine)
5. IJVM エミュレータの概要
6.まとめ
1. Java プログラムの実行
Integer Java Virtual Machine
Java バイトコードの部分集合のためのアセンブラおよびインタープリタから成るもの。
命令 : 20 種類
オペコード
ニーモニック 操作内容
0x10 BIPUSH byte_exp byte_exp をオペランド・スタックへとプッシュする
0x59 DUP オペランド・スタックの先頭にある値がコピーされ、オペランド・スタックへとプッシュされる
0xA7 GOTO label 無条件分岐を行う0x60 IADD オペランド・スタックから2つの値をポップ
して、それらの合計をプッシュする
0x7E IAND オペランド・スタックから2つの値をポップして、それらの論理積をプッシュする
0x99 IFEQ label 値をオペランド・スタックからポップし、それが0 なら分岐する
0x9B IFLT label 値をオペランド・スタックからポップし、それが0 未満なら分岐する
0x9F IF_ICMPEQ label 2つの値をオペランド・スタックからポップし、それらが等しいならば分岐する
IJVM の命令セット
IJVM の命令セットオペコー
ドニーモニック 操作内容
0x84 IINC varnum_exp,
byte_exp
vamum_exp で示されたローカル変数に、byte_exp を int へ符号拡張したものを加算する
0x15 ILOAD vamum_exp vamum_exp で示されたローカル変数をオペランド スタックへとプッシュする・
0xB6 INVOKEVIRTUAL
method
クラスに基づくディスパッチを行い、インスタンス・メソッドを起動する
0x80 IOR オペランド・スタックから2つの値をポップして、それらの論理和をプッシュする
0xAC IRETURN メソッドから int をリターンする0x36 ISTORE varmum_e
xp値をオペランド スタックからポップし、・それを varmum_exp で示すローカル変数にセットする
0x64 ISUB オペランド・スタックから2つの値をポップして、それらの差をプッシュする
オペコード ニーモニック 操作内容
0x13LDC_W constant_exp
constant_exp で示される定数をオペランド ス・タックへとプッシュする
0x00 NOP 何もしない
0x57 POPオペランド・スタックの先頭にある値をポップする
0x5F SWAPオペランド・スタックの先頭にある 2 つの値を交換する
0xC4 WIDE補助バイトを使用したローカル変数インデックスの拡張をする
IJVM の命令セット
目次
2.研究の目的と結果
4. JVM について
5. IJVM エミュレータの概要
6.まとめ
3. IJVM (Integer Java Virtual Machine)
(1) Class ファイル
(2) JVM の命令
(3) JVM の構造
1. Java プログラムの実行
Class ファイル
CA FE BA BE 00 00 00 2E 002D 0A 00 0D 00 1C 03 00 0186 A0 07 00 1D 09 00 0C 001E 0A 00 0C 00 1F 0A 00 03 00 20 0A 00 0C 00 21 07 0022 0A 00 08 00 1C 0A 00 0800 23 0A 00 08 00 24 07 0025 07 00 26 01 00 0D 63 6F6E 73 74 61 6E 74 5F 70 6F6F 6C 01 00 13 5B 4C 6A 6176 61 2F 6C 61 6E 67 2F 5374 72 69 6E 67 3B 01 00 063C 69 6E 69 74 3E 01 00 0328 29 56 01 00 04 43 6F 6465 01 00 0F 4C 69 6E 65 4
E
あるプログラムのClass ファイルの一部
メジャーバージョン
コンスタントプール
アクセスフラグ
this_class
super_class
インターフェース
フィールド
メソッド
マジックナンバー
マイナーバージョン
属性リスト
Classファイル
メソッドの属性の種類 ・ Code 属性 ・ Exceptions 属性 ・ Deprecated 属性 ・ Synthetic 属性
・・・
メソッドの個数(2バイト)
メソッド1
メソッドn
アクセスフラグ(2バイト)メソッド名 CP エントリ番号
(2バイト)ディスクプリタ CP エン
ト番号(2バイト)属性リスト
メソッド1
Class ファイル中のメソッド情報記述部分
JVMの命令が記述されているのは Code属性だけ
目次2.研究の目的と結果3. IJVM(Integer Java Virtual Machine)
5. IJVM エミュレータの概要6.まとめ
4. JVM について
(3) JVM の構造
1. Java プログラムの実行
(1) Class ファイル
(2) JVM の命令
JVM の命令オペコード : 実行する操作を定義したもの( 1 バイト)オペランド : 操作が用いるデータ(引数)
オペコード オペランドを持たない命令 オペランド
を持つ命令
オペコード
オペランド2
オペランド1
・・・
オペコードは約 200 種類
Java バイトコード : JVM の命令の集合によって記述されたもの
命令 オペコード
オペランド
iload 1 21 01
return B1
Java バイトコードの読み込み例
ある Classファイルの Javaバイトコード(16進表記 )
命令 命令引数
do { {
}}
オペコードの取得 ;if ( オペランドが必要か? )
オペランドの取得 ;
while ( オペコードが残っているか? ) ;
21 01 B1 iload 01 return
目次2.研究の目的と結果3. IJVM(Integer Java Virtual Machine)
5. IJVM エミュレータの概要6.まとめ
4. JVM について
1. Java プログラムの実行
(1) Class ファイル
(2) JVM の命令
(3) JVM の構造
JVM の構造 JVMシステム
クラスローダシステム
クラスローダ
ユーザクラスローダ
ユーザクラスローダ
ユーザクラスローダ
ユーザクラスローダ
クラスクラス
クラス
クラスクラス
クラス
クラスクラス
クラス
インスタンスインスタンス
インスタンスインスタンス
インスタンスインスタンスインスタンス
インスタンスインスタンス
スレッド
スレッド
Java スタック
プログラムカウンタ
プログラムカウンタ
フレームオペランド
スタック
ローカル変数
フレームオペランド
スタック
ローカル変数
Java スタック
プログラムカウンタ
プログラムカウンタ
フレームオペランド
スタック
ローカル変数
スレッド
スレッド
CLASSPATH
Class ファイルの取得先
インターネット
データサーバ
メソッドエリア ヒープ
Java スタックフレーム 1フレーム 2フレーム 3
スレッド A
ある Java のスレッド(スレッド A とする)が method1というメソッドを実行した場合
先頭のフレームが作業中のフレーム
method1() { method2(); …}
method2() { method3(); …}
フレーム
ローカル変数配列 オペランドスタック
this
a
b
0
1
2
a
( 例) method1 のバイトコードのある部分
method1
命令 命令
a
21 01 36 02 istore 2iload 1
目次2.研究の目的と結果
3. IJVM(Integer Java Virtual Machine)
5. IJVM エミュレータの概要6.まとめ
4. JVM について
(2) JVM の命令
1. Java プログラムの実行
(1) Class ファイル
(3) JVM の構造
Class ファイルを読み込み様々な情報を格納するプログラム
メソッドの情報を受け取り Java バイトコードを実行するプログラム
フレームを可視化するプログラム
保存しておく情報定数フィールドインターフェースメソッド
配列に格納
5. IJVM エミュレータの概要
目次1. Java プログラムの実行
3. JVM について
4. IJVM(Integer Java Virtual Machine)
2.研究の目的と結果
5. IJVM エミュレータの概要
6.まとめ
6.まとめInteger Java Virtual Machine(命令 20種類)のエミュレータ
この研究で作成したもの
Java Virtual Machine (命令約 200種類)のエミュレータを作成
IJVMには存在しない JVMの命令を作成
JVM の高速化のために、様々なアプリケーションの実行時における JVM の各命令の使用頻度及び使用順序の調査を行う。