Java仮想マシン とは?
ページ内リンク
↓ウィキペディア(Wikipedia)記事
↓Yahoo!知恵袋
ノースウエスト航空
のマイルは、国内航空会社のマイレージと違って無期限!! 格安パックツアーでも
100%マイルが付くのでお得!! 国内往復分15000マイルを貯めて沖縄や北海道へ!!
関連商品
ティム リンドホルム /
最安値(中古): ¥ 4,989
 Javaのコンパイラをはじめとする開発環境を開発するならこの本を持っている必要があり、内容も逐一理解しなければならないでしょう。そういう意味でJVMの必須リファレンスだと言えると思います。Javaに類似したプログラミング言語を設計、実装しようと考えている方々にも重要な一冊です。バイトコードの構造やJVMのインストラクションセットの説明など、説明は包括的で非常にクリアです。一方、Javaのコードがどのように動作するのかを理解したいと考えるアプリケーションプログラマにとっても得るものが多い本だと思います。ただし、本書はJVMの「仕様書」なので、内容の理解しやすさを期待してはいけません。JVMのチュートリアルとしては、「Inside The Java Virtual Machine(Bill Venners、McGraw-Hill )」などが優れていると思います。チュートリアル的な本を読みつつ本書を適宜参照するというのもJVM学習の一方法かと。
(鈴木純一 さんのレビュー)
ティム リンドホルム /
最安値(新品): ¥ 4,200
私はソフトウェア開発者で、専門はコンパイラ開発。ある時、あるターゲット・マシン用のJava VMを創る事になり、本書を手に取った。本書はVMの動作を公式(Sun認定)に規定した唯一の書であり、VM開発者にとっては必携の書である。
VM用命令セットの考え方は、Wirth博士のP-codeを土台にしている事は明らかだが、それに対してSunの設計者が何を考え、何を変えたかが分かって興味深い。また、記述の形式が統一されていて、各命令(中間コード)の動作がその統一された形式で書かれているので紛れがない。私は、開発のために本書を読んだので、ボロボロになるまで読み尽くしたが、Javaの各命令(中間コード)の意味付けの理解、また新たにこうした中間コードの設計を志す方には、目を通すだけでも参考になるだろう。
Javaの中身を垣間見ようとする方には興味深く、またVM開発者には必携の書。
(紫陽花 さんのレビュー)
ウィキペディア(Wikipedia)記事
Java仮想マシン (Java Virtual Machine, Java VM, JVM) は、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 - ヒープを2つ以上の世代に分割し、それぞれに異なるアルゴリズム(およびデータ構造)を適用する方式。
GCアルゴリズム(データ構造)
- コピーGC
- Mark & Sweep
- Mostly Concurrent Mark & Sweep
- Mark & Compact
関連項目
外部リンク
 All text is available under the terms of the GNU Free Documentation License. この記事は、ウィキペディアの記事を複製、改変、再配布したものにあたり、 GNU Free Documentation Licenseというライセンスの下で提供されています。 ことなびに掲載されているウィキペディアの記事も、全て GNU Free Documentation Licenseの元に提供されております。
Yahoo!知恵袋
-
Yahooゲームで強制終了してしまうのはなぜですか?最近、Yahooゲーム内のJavaゲームを遊ぼうとするとブラウザを強制終了してしまいますなぜでしょうか?今までは遊べていたのですが…どなたかわかる方いらっしゃいましたら回答お願いいたします。
解決日時:Sun, 23 Nov 2008 03:04:05 +0900 /
回答数:1 /
スコア:113,251点
-
C++とC#について二つはどのような特徴がありますか?どんな違いがありますか?これからプログラミングを勉強しようと思っているのですが初心者にはどちらが向いていますか?
解決日時:Thu, 20 Nov 2008 04:02:24 +0900 /
回答数:1 /
スコア:45,934点
-
ゲームしようと思ってテーブルをクリックすると、「同じプロセスで実行中のいくつかのjava仮想マシンによってエラーが発生しました」って表示が出てきてゲームがスタートできません。何が原因で、どうすれば復旧できるのでしょうか?
解決日時:Sun, 21 Sep 2008 03:56:22 +0900 /
回答数:1 /
スコア:165,636点
-
JAVAとWindowsCEについて。プラットフォームを選ばないというJAVAですが、WindowsCEにはどこまで対応しているのでしょうか。開発ソフトC++とVBを提供しているWindowsCEマシンの開発をJAVAで行うとしたら何が必要?
解決日時:Thu, 28 Aug 2008 03:34:42 +0900 /
回答数:1 /
スコア:149,447点
-
■JAVAがおかしい・・???ヤフーのビリをしようと入ったのですが、「同じプロセスで実行中のいくつかのJava仮想マシンによってエラーが発生しました」と出ます。まったくの意味不明なので教えてくださいほかは何も立ち上げてはいないはずなんですが。。。。
解決日時:Mon, 25 Aug 2008 03:24:39 +0900 /
回答数:1 /
スコア:171,227点
-
プログラミング言語について今学校でCを勉強しています。プログラミング言語にはたくさん種類がありますが、そのうち何個か有名なのを挙げて、それぞれの得意分野や苦手分野などを教えてください。だいたい分かっているような感じですが、まだ詳しく知りません。
解決日時:Sun, 24 Aug 2008 03:10:45 +0900 /
回答数:2 /
スコア:97,335点
|
↓ニュース
↓YouTube
↓テレビ番組
↓はてブ
↓ヤフオク
↓このページへのリンク
PageRank5以上の相互リンク
・相互リンクスクエア
(PageRank 5)
・相互リンク インプロス
(PageRank 5)
→便利!NINJA TOOLS
→FC2検索
用語
Wikipedia
YouTube
|