See also ebooksgratis.com: no banners, no cookies, totally FREE.

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
Java仮想マシン - Wikipedia

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

[編集] 実装系

エンタープライズ用(デスクトップ用を包含)としては、SunIBMBEAHPなどの各社から実装系がリリースされている。 OS上でアプリケーションとして動作する形態が一般的であるが、Azul Systems社のAzul Compute Applianceのようにバイトコードを実行を外部のプロセッサで行うタイプも存在する。

この節は執筆の途中です この節は執筆中です。加筆、訂正して下さる協力者を求めています。

[編集] バイトコード解釈

初期のJava VMはインタプリタ型であったため、動作速度が他のアプリケーションに比べて遅い場合があった。そのため、メソッドの実行直前(Just in Time)にバイトコードをCPUのネイティブコードにコンパイルして実行する形式(JITコンパイラ)を、BorlandIBMなどがリリースした。SunHotSpotという高速化技術を導入した。 HotSpotJITコンパイラの一種だが、常に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関連の教科書や解説書があります。


aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -