Java仮想マシン
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Java仮想マシン(Java VM)は、Javaバイトコードとして定義された命令セットを実行するスタック型の仮想マシン。APIやいくつかのツールとセットでJava Runtime Environment(JRE) としてリリースされている。この環境を移植することで、さまざまな環境でJavaのプログラムを実行することができる。
目次 |
[編集] 命令セット仕様
[編集] ニーモニック表
0x00 | 0x01 | 0x02 | 0x03 | 0x04 | 0x05 | 0x06 | 0x07 | 0x08 | 0x09 | 0x0a | 0x0b | 0x0c | 0x0d | 0x0e | 0x0f | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x00 | 0x00 nop |
0x01 aconst_null |
0x02 iconst_m1 |
0x03 iconst_0 |
0x04 iconst_1 |
0x05 iconst_2 |
0x06 iconst_3 |
0x07 iconst_4 |
0x08 iconst_5 |
0x09 lconst_0 |
0x0a lconst_1 |
0x0b fconst_0 |
0x0c fconst_1 |
0x0d fconst_2 |
0x0e dconst_0 |
0x0f dconst_1 |
0x10 | 0x10 bipush |
0x11 sipush |
0x12 ldc |
0x13 ldc_w |
0x14 ldc2_w |
0x15 iload |
0x16 lload |
0x17 fload |
0x18 dload |
0x19 aload |
0x1a iload_0 |
0x1b iload_1 |
0x1c iload_2 |
0x1d iload_3 |
0x1e lload_0 |
0x1f lload_1 |
0x20 | 0x20 lload_2 |
0x21 lload_3 |
0x22 fload_0 |
0x23 fload_1 |
0x24 fload_2 |
0x25 fload_3 |
0x26 dload_0 |
0x27 dload_1 |
0x28 dload_2 |
0x29 dload_3 |
0x2a aload_0 |
0x2b aload_1 |
0x2c aload_2 |
0x2d aload_3 |
0x2e iaload |
0x2f laload |
0x30 | 0x30 faload |
0x31 daload |
0x32 aaload |
0x33 baload |
0x34 caload |
0x35 saload |
0x36 istore |
0x37 lstore |
0x38 fstore |
0x39 dstore |
0x3a astore |
0x3b istore_0 |
0x3c istore_1 |
0x3d istore_2 |
0x3e istore_3 |
0x3f lstore_0 |
0x40 | 0x40 lstore_1 |
0x41 lstore_2 |
0x42 lstore_3 |
0x43 fstore_0 |
0x44 fstore_1 |
0x45 fstore_2 |
0x46 fstore_3 |
0x47 dstore_0 |
0x48 dstore_1 |
0x49 dstore_2 |
0x4a dstore_3 |
0x4b astore_0 |
0x4c astore_1 |
0x4d astore_2 |
0x4e astore_3 |
0x4f iastore |
0x50 | 0x50 lastore |
0x51 fastore |
0x52 dastore |
0x53 aastore |
0x54 bastore |
0x55 castore |
0x56 sastore |
0x57 pop |
0x58 pop2 |
0x59 dup |
0x5a dup_x1 |
0x5b dup_x2 |
0x5c dup2 |
0x5d dup2_x1 |
0x5e dup2_x2 |
0x5f swap |
0x60 | 0x60 iadd |
0x61 ladd |
0x62 fadd |
0x63 dadd |
0x64 isub |
0x65 lsub |
0x66 fsub |
0x67 dsub |
0x68 imul |
0x69 lmul |
0x6a fmul |
0x6b dmul |
0x6c idiv |
0x6d ldiv |
0x6e fdiv |
0x6f ddiv |
0x70 | 0x70 irem |
0x71 lrem |
0x72 frem |
0x73 drem |
0x74 ineg |
0x75 lneg |
0x76 fneg |
0x77 dneg |
0x78 ishl |
0x79 lshl |
0x7a ishr |
0x7b lshr |
0x7c iushr |
0x7d lushr |
0x7e iand |
0x7f land |
0x80 | 0x80 ior |
0x81 lor |
0x82 ixor |
0x83 lxor |
0x84 iinc |
0x85 i2l |
0x86 i2f |
0x87 i2d |
0x88 l2i |
0x89 l2f |
0x8a l2d |
0x8b f2i |
0x8c f2l |
0x8d f2d |
0x8e d2i |
0x8f d2l |
0x90 | 0x90 d2f |
0x91 i2b |
0x92 i2c |
0x93 i2s |
0x94 lcmp |
0x95 fcmpl |
0x96 fcmpg |
0x97 dcmpl |
0x98 dcmpg |
0x99 ifeq |
0x9a ifne |
0x9b iflt |
0x9c ifge |
0x9d ifgt |
0x9e ifle |
0x9f if_icmpeq |
0xa0 | 0xa0 if_icmpne |
0xa1 if_icmplt |
0xa2 if_icmpge |
0xa3 if_icmpgt |
0xa4 if_icmple |
0xa5 if_acmpeq |
0xa6 if_acmpne |
0xa7 goto |
0xa8 jsr |
0xa9 ret |
0xaa tableswitch |
0xab lookupswitch |
0xac ireturn |
0xad lreturn |
0xae freturn |
0xaf dreturn |
0xb0 | 0xb0 areturn |
0xb1 return |
0xb2 getstatic |
0xb3 putstatic |
0xb4 getfield |
0xb5 putfield |
0xb6 invokevirtual |
0xb7 invokespecial |
0xb8 invokestatic |
0xb9 invokeinterface |
a | 0xbb new |
0xbc newarray |
0xbd anewarray |
0xbe arraylength |
0xbf athrow |
0xc0 | 0xc0 checkcast |
0xc1 instanceof |
0xc2 monitorenter |
0xc3 monitorexit |
0xc4 wide |
0xc5 multianewarray |
0xc6 ifnull |
0xc7 ifnonnull |
0xc8 goto_w |
0xc9 jsr_w |
0xca breakpoint |
b | c | d | e | f |
0xd0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f |
0xe0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f |
0xf0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | 0xfe impdep1 |
0xff impdep2 |
[編集] オペコード解説
[編集] 配列 =
- iaload, laload, faload, daload, aaload, baload, caload, saload - 配列からint, long, float, double, オブジェクト, byteまたはboolean, char, shortを取り出す。
- iastore, lastore, fastore, dastore, aastore, bastore, castore, sasoter - 配列にint, long, float, double, オブジェクト, byteまたはboolean, char, shortを格納。
- newarray - 数値や文字の配列を作成。
- anewarray - オブジェクト配列を作成。
- multianewarray - 多次元配列を作成。
- arraylength - 配列の長さを取得
[編集] メソッド呼び出し
- invokevirtual - インスタンスメソッドを呼び出す。
- invokespecial - インスタンス初期化メソッド、privateメソッド、スーパークラスのインスタンスメソッドを呼び出す。
- invokestatic - staticメソッドを呼び出す
- invokeinterface - インターフェイスメソッドを呼び出す
[編集] return
- return - 返値なしでreturn
- ireturn, lreturn, freturn, dreturn, areturn - int, long, float, double, オブジェクトを返値としてreturnする。
[編集] 比較
- dcmpg, dcmpl - double同士を比較。NaNの時は1, -1。
- fcmpg, fcmpl - float同士を比較。NaNの時は1, -1。
- lcmp - long同士を比較。
[編集] 条件分岐
- ifeq, ifnull, iflt, ifle, ifne, ifnonnull, ifgt, ifge - スタックの値が0, null, 0未満, 0以下, 0以外, null以外, 0より大きい, 0以上ならジャンプする
- if_icmpeq, if_icmpne, if_icmplt, if_icmpgt, if_icmple, if_icmpge - 2つのint値が等しい、等しくない、<、>、≦、≧ならジャンプする
- if_acmpeq, if_acmpne - 2つのオブジェクトが同一、異なるオブジェクトを参照していたらジャンプする。
[編集] ジャンプ
- goto, goto_w - 現在のプログラムカウンタにそれぞれ2,4バイト加えたアドレスに制御が移る。
- jsr, jsr_w - サブルーチンへジャンプする。gotoと違い戻りアドレスを保存する。戻りアドレスの値はそれぞれジャンプ前のアドレス+3,5となる。
- ret - サブルーチンの呼び出し元に戻る。アドレスが格納されているローカル変数を指定する。
- lookupswitch - switch文のcase式の値が不連続である場合値を探しながらジャンプ先を探す。
- tableswitch - switch文のcase式の値が連続である場合キー値をindexとしジャンプ先アドレスを値とする配列を作り高速にジャンプする。
[編集] スタックに積む
- bipush, sipush - byte, shortをスタックに積む。
- ldc - コンスタントプール内の4バイトの定数(int,float,String)の内1バイト以内でエントリ番号を指定できるものをスタックに積む。
- ldc_w - エントリ番号が1バイトでは足りないときに使う。
- ldc2_w - コンスタントプール内の8バイトの定数(long,double)をスタックに積む。
- iconst_m1, iconst_0, iconst_1, iconst_2, iconst_3, iconst_4, iconst_5 - intの-1,0,1,2,3,4,5をスタックに積む。
- lconst_0, lconst_1 - longの0,1をスタックに積む
- fconst_0, fconst_1, fconst_2 - floatの0,1,2をスタックに積む
- dconst_0, dconst_1 - doubleの0,1をスタックに積む。
- aconst_null - スタックにnullを積む。
[編集] スタック編集
- pop, pop2 - スタックから1,2ワード取り除く
- dup, dup2
- dup_x1, dup2_x1
- dup_x2, dup2_x2
- swap
[編集] ローカル変数
- iload, lload, fload, dload, aload - ローカル変数からint, long, float, double, オブジェクトを取り出してスタックに積む。
- iload_0, iload_1, iload_2, iload_3 - n番目のローカル変数からintを取り出してスタックに積む。
- lload_0, lload_1, lload_2, lload_3 - n番目のローカル変数からlongを取り出してスタックに積む。
- fload_0, fload_1, fload_2, fload_3 - n番目のローカル変数からfloatを取り出してスタックに積む。
- dload_0, dload_1, dload_2, dload_3 - n番目のローカル変数からdoubleを取り出してスタックに積む。
- aload_0, aload_1, aload_2, aload_3 - n番目のローカル変数からオブジェクトを取り出してスタックに積む。
- istore, lstore, fstore, dstore, astore - int, long, float, double, オブジェクトをローカル変数に格納。
- istore_0, istore_1, istore_2, istore_3 - intをn番目のローカル変数に格納。
- lstore_0, lstore_1, lstore_2, lstore_3 - longをn番目のローカル変数に格納。
- fstore_0, fstore_1, fstore_2, fstore_3 - floatをn番目のローカル変数に格納。
- dstore_0, dstore_1, dstore_2, dstore_3 - doubleをn番目のローカル変数に格納。
- astore_0, astore_1, astore_2, astore_3 - オブジェクトをn番目のローカル変数に格納。
[編集] 型キャスト
- checkcast - オブジェクトまたは配列の型を確認。
- instanceof - スタックからオブジェクト参照をpopし、それが指定された型と同じであれば「1」を、異なれば「0」をスタックに積む。
- i2l, i2f, i2d, i2b, i2c, i2s - intからlong, float, double, byte, char, shortに型キャスト
- l2i, l2f, l2d - longからint, float, doubleに型キャスト
- f2i, f2l, f2d - floatからint, long, doubleに型キャスト
- d2i, d2l, d2f - doubleからint, long, floatに型キャスト
[編集] 算術演算
- iinc
- iadd, ladd, fadd, dadd - int, long, float, double同士の足し算
- isub, lsub, fsub, dsub - int, long, float, double同士の引き算
- imul, lmul, fmul, dmul - int, long, float, double同士の掛け算
- idiv, ldiv, fdiv, ddiv - int, long, float, double同士の割り算
- irem, lrem, frem, drem - int, long, float, double同士の余り
- ineg, lneg, fneg, dneg - int, long, float, doubleの符号反転
[編集] 論理演算
- ishl, lshl
- ishr, lshr
- iushr, lushr
- iand, land
- ior, lor
- ixor, lxor
[編集] オブジェクト
- new - オブジェクトの生成
- putfield, getfield - メンバ変数の設定、取り出し
- putstatic, getstatic - static変数の設定、取り出し
[編集] その他
- athrow - 例外を発生させる
- nop - なにもしない
- breakpoint
- monitorenter - ロック取得
- monitorexit - ロック解放
- wide
[編集] 実装系
エンタープライズ用(デスクトップ用を包含)としては、Sun、IBM、BEA、HPなどの各社から実装系がリリースされている。 OS上でアプリケーションとして動作する形態が一般的であるが、Azul Systems社のAzul Compute Applianceのようにバイトコードを実行を外部のプロセッサで行うタイプも存在する。
[編集] バイトコード解釈
初期のJava VMはインタプリタ型であったため、動作速度が他のアプリケーションに比べて遅い場合があった。そのため、メソッドの実行直前(Just in Time)にバイトコードをCPUのネイティブコードにコンパイルして実行する形式(JITコンパイラ)を、Borland や IBMなどがリリースした。SunもHotSpotという高速化技術を導入した。 HotSpotはJITコンパイラの一種だが、常にJITコンパイルを行うのではなく、実行回数が規定回数を超えたメソッド(Hotspot)のみをJITコンパイルする。これにより、JITコンパイルによる無駄なリソースの消費を防いだり、インタプリタ実行時のプロファイリング情報をJITコンパイル利用できる利点がある。HotSpotには用途別に、クライアントVM(コンパイルは高速だが生成されるネイティブコードがあまり最適化されない)と、サーバVM(コンパイルは低速だが生成されるネイティブコードがそこそこ最適化される)がある。
[編集] スレッド
- グリーンスレッド - pthread等、OSが提供するスレッドライブラリを直接使わずJavaで仮想的なスレッドを作り実行する形式。現在はあまり利用されていない。
- ネイティブスレッド - OSが提供するスレッドライブラリとJavaスレッドが1x1で対応する形式。
[編集] GC
- 世代別GC - ヒープを2つ以上の世代に分割し、それぞれに異なるアルゴリズム(およびデータ構造)を適用する方式。
[編集] GCアルゴリズム(データ構造)
- コピーGC
- Mark & Sweep
- Mostly Concurrent Mark & Sweep
- Mark & Compact
[編集] 関連項目
- Kaffe - フリーなJava仮想マシン実装
[編集] 外部リンク
|
|
---|---|
主要技術 | プログラミング言語Java - Javaプラットフォーム - Java Development Kit - Java仮想マシン - Java Runtime Environment - Javaコンパイラ - Javaバイトコード - JAR |
歴史 | Javaに対する批判 - Java Community Process - サン・マイクロシステムズ |
言語機能 | 文法 - Javaの予約語 - パッケージ - Javadoc |
関連技術 | Jakarta Project - Apache Tomcat - NetBeans - Java Beans - Java Message Service - Java Transaction API - Java3D - JDBC - Java Web Start - Applet - Servlet - JavaServer Pages - Java Foundation Classes |
|
|
---|---|
ソフトウェア | Solaris • OpenSolaris • SunOS • Java • JDS • JES • StarOffice(日本ではStarSuite)/OpenOffice.org • NIS/NIS+ • Sun ONE • NFS • ZFS • DTrace • Sun Grid Engine • MySQL |
ハードウェア | Sun-1 • Sun-2 • Sun-3 • Sun386i • Sun-4 • SPARCstation • Sun Ultra series • Sun Enterprise • Sun Blade • Sun Fire • UltraSPARC T1 • SPARC • JavaStation • Sun Ray • Sun Modular Datacenter • Sun SPOT • SPARC Enterprise |
Education and Recognition | SCP • Sun COE |
関連人物 | ジョナサン・シュワルツ • アンディ・ベクトルシャイム • スコット・マクネリ • ビル・ジョイ • ビノッド・コースラ • ジェームズ・ゴスリン |