Java仮想マシン

Javaバイトコードを実行する仮想マシン

Java: Java virtual machineJava VMJVMJavaAPIJavaJREJava
Java仮想マシン(JVM)のアーキテクチャ概要。ソースコードは一旦Javaバイトコードへとコンパイルされ、さらにインタプリタまたはJITコンパイラによりネイティブコードに変換されて実行される。Java APIとJVMの両者でJava実行環境(JRE)を構成する。

命令セット仕様

編集

ニーモニック表

編集

(12、C6 などの数値は16進法表記)

  -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -A -B -C -D -E -F
0- 00
nop
01
aconst_null
02
iconst_m1
03
iconst_0
04
iconst_1
05
iconst_2
06
iconst_3
07
iconst_4
08
iconst_5
09
lconst_0
0A
lconst_1
0B
fconst_0
0C
fconst_1
0D
fconst_2
0E
dconst_0
0F
dconst_1
1- 10
bipush
11
sipush
12
ldc
13
ldc_w
14
ldc2_w
15
iload
16
lload
17
fload
18
dload
19
aload
1A
iload_0
1B
iload_1
1C
iload_2
1D
iload_3
1E
lload_0
1F
lload_1
2- 20
lload_2
21
lload_3
22
fload_0
23
fload_1
24
fload_2
25
fload_3
26
dload_0
27
dload_1
28
dload_2
29
dload_3
2A
aload_0
2B
aload_1
2C
aload_2
2D
aload_3
2E
iaload
2F
laload
3- 30
faload
31
daload
32
aaload
33
baload
34
caload
35
saload
36
istore
37
lstore
38
fstore
39
dstore
3A
astore
3B
istore_0
3C
istore_1
3D
istore_2
3E
istore_3
3F
lstore_0
4- 40
lstore_1
41
lstore_2
42
lstore_3
43
fstore_0
44
fstore_1
45
fstore_2
46
fstore_3
47
dstore_0
48
dstore_1
49
dstore_2
4A
dstore_3
4B
astore_0
4C
astore_1
4D
astore_2
4E
astore_3
4F
iastore
5- 50
lastore
51
fastore
52
dastore
53
aastore
54
bastore
55
castore
56
sastore
57
pop
58
pop2
59
dup
5A
dup_x1
5B
dup_x2
5C
dup2
5D
dup2_x1
5E
dup2_x2
5F
swap
6- 60
iadd
61
ladd
62
fadd
63
dadd
64
isub
65
lsub
66
fsub
67
dsub
68
imul
69
lmul
6A
fmul
6B
dmul
6C
idiv
6D
ldiv
6E
fdiv
6F
ddiv
7- 70
irem
71
lrem
72
frem
73
drem
74
ineg
75
lneg
76
fneg
77
dneg
78
ishl
79
lshl
7A
ishr
7B
lshr
7C
iushr
7D
lushr
7E
iand
7F
land
8- 80
ior
81
lor
82
ixor
83
lxor
84
iinc
85
i2l
86
i2f
87
i2d
88
l2i
89
l2f
8A
l2d
8B
f2i
8C
f2l
8D
f2d
8E
d2i
8F
d2l
9- 90
d2f
91
i2b
92
i2c
93
i2s
94
lcmp
95
fcmpl
96
fcmpg
97
dcmpl
98
dcmpg
99
ifeq
9A
ifne
9B
iflt
9C
ifge
9D
ifgt
9E
ifle
9F
if_icmpeq
A- A0
if_icmpne
A1
if_icmplt
A2
if_icmpge
A3
if_icmpgt
A4
if_icmple
A5
if_acmpeq
A6
if_acmpne
A7
goto
A8
jsr
A9
ret
AA
tableswitch
AB
lookupswitch
AC
ireturn
AD
lreturn
AE
freturn
AF
dreturn
B- B0
areturn
B1
return
B2
getstatic
B3
putstatic
B4
getfield
B5
putfield
B6
invokevirtual
B7
invokespecial
B8
invokestatic
B9
invokeinterface
BA
invokedynamic
BB
new
BC
newarray
BD
anewarray
BE
arraylength
BF
athrow
C- C0
checkcast
C1
instanceof
C2
monitorenter
C3
monitorexit
C4
wide
C5
multianewarray
C6
ifnull
C7
ifnonnull
C8
goto_w
C9
jsr_w
CA
breakpoint
CB
未定義
CC
未定義
CD
未定義
CE
未定義
CF
未定義
D- D0
未定義
D1
未定義
D2
未定義
D3
未定義
D4
未定義
D5
未定義
D6
未定義
D7
未定義
D8
未定義
D9
未定義
DA
未定義
DB
未定義
DC
未定義
DD
未定義
DE
未定義
DF
未定義
E- E0
未定義
E1
未定義
E2
未定義
E3
未定義
E4
未定義
E5
未定義
E6
未定義
E7
未定義
E8
未定義
E9
未定義
EA
未定義
EB
未定義
EC
未定義
ED
未定義
EE
未定義
EF
未定義
F- F0
未定義
F1
未定義
F2
未定義
F3
未定義
F4
未定義
F5
未定義
F6
未定義
F7
未定義
F8
未定義
F9
未定義
FA
未定義
FB
未定義
FC
未定義
FD
未定義
FE
impdep1
FF
impdep2

オペコード解説

編集

スタック

編集

bipush sipush - byte short

ldc - 4(intfloatjava.lang.String)1

ldc_w - 1使

ldc2_w - 8(longdouble)

iconst_m1 iconst_0 iconst_1 iconst_2 iconst_3 iconst_4 iconst_5 - int-1012345

lconst_0 lconst_1 - long01

fconst_0 fconst_1 fconst_2 - float012

dconst_0 dconst_1 - double01

aconst_null - null

pop pop2 - 12

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 - 0123int

lload_0 lload_1 lload_2 lload_3 - 0123long

fload_0 fload_1 fload_2 fload_3 - 0123float

dload_0 dload_1 dload_2 dload_3 - 0123double

aload_0 aload_1 aload_2 aload_3 - 0123

istore lstore fstore dstore astore - int long float double 

istore_0 istore_1 istore_2 istore_3 - int0123

lstore_0 lstore_1 lstore_2 lstore_3 - long0123

fstore_0 fstore_1 fstore_2 fstore_3 - float0123

dstore_0 dstore_1 dstore_2 dstore_3 - double0123

astore_0 astore_1 astore_2 astore_3 - 0123

条件付きジャンプ

編集

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 - 2int

if_acmpeq if_acmpne - 2

ジャンプ

編集

goto goto_w - 216432JavaGO TOJavagoto

jsr jsr_w - goto+3+5

ret - 

lookupswitch - switchcase

tableswitch - switchcase使

メソッド呼び出し・復帰

編集

invokevirtual - 

invokespecial - 

invokestatic - 

invokeinterface - 

return - 

ireturn lreturn freturn dreturn areturn -  int long float double

型キャスト

編集

checkcast - 

instanceof - pop10

i2l i2f i2d i2b i2c i2s - intlong float double byte char short

l2i l2f l2d - longint float double

f2i f2l f2d - floatint long double

d2i d2l d2f - doubleint long float

比較演算

編集

dcmpg dcmpl - double10-1-g-lNaN

fcmpg fcmpl - float

lcmp - long

算術演算

編集

iinc - int1-12812732

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 value1 - (value1 / value2) * value2

ineg lneg fneg dneg - int long float double 123-123-123123002

論理演算

編集
  • ishllshl - int値、 long値 を指定ビットだけ左にシフトした値をスタックに残す。
  • ishrlshr - int値、 long値 を指定ビットだけ右に算術シフトした値をスタックに残す。負数はシフト後も負に維持される。
  • iushrlushr - int値、 long を指定ビットだけ右に論理シフトした値をスタックに残す。
  • iandland - int値、 long値 の2オペランドのAND(ビットごとの論理積)を求め、スタックに残す。
  • iorlor - int値、 long の2オペランドの OR(ビットごとの論理和)を求め、スタックに残す。
  • ixorlxor - int値、 long の2オペランドのXOR(ビットごとの排他的論理和)を求め、スタックに残す。

オブジェクト

編集
  • new - インスタンスの生成
  • putfieldgetfield - メンバ変数への値の代入、値の取り出し
  • putstaticgetstatic - クラス変数への値の代入、値の取り出し

配列

編集

iaload laload faload daload aaload baload caload saload - int long floatdoublebytebooleanchar short

iastore lastore fastore dastore aastore bastore castore sastore - int long float double  byteboolean char short

newarray - 

anewarray - 

multianewarray - 

arraylength - 

その他

編集
  • athrow - java.lang.Throwableのインスタンスで例外やエラーを発生させる。
  • nop - 何もしない (no operation)。
  • breakpoint - デバッガがブレークポイントの実装に使える命令。
  • monitorenter - オブジェクトのモニタをロックする。既に他のスレッドにロックされていれば待たされる。
  • monitorexit - オブジェクトのモニタをアンロックする。他のスレッドのロック待ちは再度試行される。
  • wide - ロード/ストア系命令やretiincのインデックスを16ビットに拡張する。iincでは定数も16ビットに拡張する。

実装系

編集

IBMHPOS

WindowsJavaWindows XPOSJava使

IKVM.NETJava

GNU SmalltalkVMJava[1]

picoJava, Jazelle Java

JITコンパイル

編集

JavaJDK 1.0Just in TimeCPUJIT IBMJDK 1.1JIT

JDK 1.2HotSpotHotSpotJITJIT (Hotspot) JITJITJITHotSpotVMVM

スレッド

編集
  • グリーンスレッド - pthread等、OSが提供するスレッドライブラリを直接使わずJavaで仮想的なスレッドを作り実行する形式。現在はあまり利用されていない。
  • ネイティブスレッド - OSが提供するスレッドライブラリとJavaスレッドが1x1で対応する形式。

ガベージコレクション

編集
  • 世代別GC - ヒープを2つ以上の世代に分割し、それぞれに異なるアルゴリズム(およびデータ構造)を適用する方式。

GCアルゴリズム(データ構造)

編集
  • コピーGC
  • Mark & Sweep
  • Mostly Concurrent Mark & Sweep
  • Mark & Compact

脚注

編集
  1. ^ smalltalk/packages/java at master · gnu-smalltalk/smalltalk” (英語). GitHub. 2015年2月18日閲覧。

関連項目

編集

外部リンク

編集