今天晚上在看<计算机组成与体系结构>的时候,很巧遇上了JVM这一章节,于是自己作了个总结,供大家参考下。因为课本是英文原版的,我在这里摘录了一些语句,就不翻译了~~有什么错误请各位指出~~~
A virtual machine is a software emulation( 仿真) of a real machine.
It's the JVM's responsibility to load, check, find, and execute btyecodes at the runtime.
JVM acts as an interpreter, taking Java bytecodes and interpreting them into underlying machine instruction.
Compling a C++ program results in an assembly language program that is translated to machine code.
C++ is complied lanuage while Java ,Perl and Python are P-codes, which execute from 5 to 10 times more slowly than C++;
Java's bytecodes is a
stack-based language, partially composed of zero address intructoin.要查看字节码是基于栈的话,可以用 javap -c命令来查看,这个链接是我在UC发的一个贴,是关于javap -c 和bytecodes is a
stack-based language的:http://www.unix-center.net/bbs/viewthread.php?tid=12799&page=1&extra=page%3D1
Java uses
two's complement to represent signed integers but does not allow for unsigned integers.请看截图:
Table 5-1. Ranges of the Java Virtual Machineís data types(来自 inside Java virtual Machine 一书)
Type |
Range |
byte |
8-bit signed two's complement integer (-27 to 27 - 1, inclusive) |
short |
16-bit signed two's complement integer (-215 to 215 - 1, inclusive) |
int |
32-bit signed two's complement integer (-231 to 231 - 1, inclusive) |
long |
64-bit signed two's complement integer (-263 to 263 - 1, inclusive) |
char |
16-bit unsigned Unicode character (0 to 216 - 1, inclusive) |
float |
32-bit IEEE 754 single-precision float |
double |
64-bit IEEE 754 double-precision float |
returnValue |
address of an opcode within the same method |
reference |
reference to an object on the heap, or null |
从数的表示范围(-2 n-1 ---- 2 n-1-1)可以看出,是用补码保存的,
Java has four registers, which provide access to five different main memory regions.
JVM的内部组成:
JVM工作环境:
Figure 1-4, native methods are the connection between a Java program and an underlying host operating system.
最后给出一些Java 虚拟机规范定义的字节代码指令:
Opcode Mnemonic by Function Group
Stack Operations (Chapter 10)
Instructions that push a constant onto the stack
aconst_null |
Push null object reference |
iconst_m1 |
Push int constant -1 |
iconst_0 |
Push int constant 0 |
iconst_1 |
Push int constant 1 |
iconst_2 |
Push int constant 2 |
iconst_3 |
Push int constant 3 |
iconst_4 |
Push int constant 4 |
iconst_5 |
Push int constant 5 |
lconst_0 |
Push long constant 0 |
lconst_1 |
Push long constant 1 |
fconst_0 |
Push float constant 0.0 |
fconst_1 |
Push float constant 1.0 |
fconst_2 |
Push float constant 2.0 |
dconst_0 |
Push double constant 0.0 |
dconst_1 |
Push double constant 1.0 |
bipush |
Push 8-bit signed integer |
sipush |
Push 16-bit signed integer |
ldc |
Push item from constant pool |
ldcw |
Push item from constant pool (wide index) |
ldc2_w |
Push long or double from constant pool (wide index) |
Instructions that load a local variable onto the stack
iload |
Load int from local variable |
lload |
Load long from local variable |
fload |
Load float from local variable |
dload |
Load double from local variable |
aload |
Load reference from local variable |
iload_0 |
Load int from local variable 0 |
iload_1 |
Load int from local variable 1 |
iload_2 |
Load int from local variable 2 |
iload_3 |
Load int from local variable 3 |
lload_0 |
Load long from local variable 0 |
lload_1 |
Load long from local variable 1 |
lload_2 |
Load long from local variable 2 |
lload_3 |
Load long from local variable 3 |
fload_0 |
Load float from local variable 0 |
fload_1 |
Load float from local variable 1 |
fload_2 |
Load float from local variable 2 |
fload_3 |
Load float from local variable 3 |
dload_0 |
Load double from local variable 0 |
dload_1 |
Load double from local variable 1 |
dload_2 |
Load double from local variable 2 |
dload_3 |
Load double from local variable 3 |
aload_0 |
Load reference from local variable 0 |
aload_1 |
Load reference from local variable 1 |
aload_2 |
Load reference from local variable 2 |
aload_3 |
Load reference from local variable 3 |
iaload |
Load int from array |
laload |
Load long from array |
faload |
Load float from array |
daload |
Load double from array |
aaload |
Load reference from array |
baload |
Load byte or boolean from array |
caload |
Load char from array |
saload |
Load short from array |
Instructions that store a value from the stack into a local variable
istore |
Store int into local variable |
lstore |
Store long into local variable |
fstore |
Store float into local variable |
dstore |
Store double into local variable |
astore |
Store reference or returnAddress into local variable |
istore_0 |
Store int into local variable 0 |
istore_1 |
Store int into local variable 1 |
istore_2 |
Store int into local variable 2 |
istore_3 |
Store int into local variable 3 |
lstore_0 |
Store long into local variable 0 |
lstore_1 |
Store long into local variable 1 |
lstore_2 |
Store long into local variable 2 |
lstore_3 |
Store long into local variable 3 |
fstore_0 |
Store float into local variable 0 |
fstore_1 |
Store float into local variable 1 |
fstore_2 |
Store float into local variable 2 |
fstore_3 |
Store float into local variable 3 |
dstore_0 |
Store double into local variable 0 |
dstore_1 |
Store double into local variable 1 |
dstore_2 |
Store double into local variable 2 |
dstore_3 |
Store double into local variable 3 |
astore_0 |
Store reference or returnAddress into local variable 0 |
astore_1 |
Store reference or returnAddress into local variable 1 |
astore_2 |
Store reference or returnAddress into local variable 2 |
astore_3 |
Store reference or returnAddress into local variable 3 |
iastore |
Store into int array |
lastore |
Store into long array |
fastore |
Store into float array |
dastore |
Store into double array |
aastore |
Store into reference array |
bastore |
Store into byte or boolean array |
castore |
Store into char array |
sastore |
Store into short array |
The wide instruction
wide |
Extend a local variable index with additional bytes |
Generic (typeless) stack operations
nop |
Do nothing |
pop |
Pop top stack word |
pop2 |
Pop top two stack words |
dup |
Duplicate top stack word |
dup_x1 |
Duplicate top stack word and put two down |
dup_x2 |
Duplicate top stack word and put three down |
dup2 |
Duplicate top two stack words |
dup2_x1 |
Duplicate top two stack words and put two down |
dup2_x2 |
Duplicate top two stack words and put three down |
swap |
Swap top two stack words |
Type Conversion (Chapter 11)
i2l |
Convert int to long |
i2f |
Convert int to float |
i2d |
Convert int to double |
l2i |
Convert long to int |
l2f |
Convert long to float |
l2d |
Convert long to double |
f2i |
Convert float to int |
f2l |
Convert float to long |
f2d |
Convert float to double |
d2i |
Convert double to int |
d2l |
Convert double to long |
d2f |
Convert double to float |
i2b |
Convert int to byte |
i2c |
Convert int to char |
i2s |
Convert int to short |
Integer Arithmetic (Chapter 12)
iadd |
Add ints |
ladd |
Add longs |
isub |
Subtract ints |
lsub |
Subtract longs |
imul |
Multiply ints |
lmul |
Multiply longs |
idiv |
Divide ints |
ldiv |
Divide longs |
irem |
Calculate remainder of division of ints |
lrem |
Calculate remainder of division of longs |
ineg |
Negate int |
lneg |
Negate long |
iinc |
Increment int local variable by constant |
Logic (Chapter 13)
Shift operations
ishl |
Perform left shift on int |
lshl |
Perform left shift on long |
ishr |
Perform arithmetic right shift on int |
lshr |
Perform arithmetic right shift on long |
iushr |
Perform logical right shift on int |
lushr |
Perform logical right shift on long |
Bitwise boolean operations
iand |
Perform boolean AND on ints |
land |
Perform boolean AND on longs |
ior |
Perform boolean OR on ints |
lor |
Perform boolean OR on longs |
ixor |
Perform boolean XOR on ints |
lxor |
Perform boolean XOR on longs |
Floating Point Arithmetic (Chapter 14)
fadd |
Add floats |
dadd |
Add doubles |
fsub |
Subtract floats |
dsub |
Subtract doubles |
fmul |
Multiply floats |
dmul |
Multiply doubles |
fdiv |
Divide floats |
ddiv |
Divide doubles |
frem |
Calculate remainder of division of floats |
drem |
Calculate remainder of division of doubles |
fneg |
Negate float |
dneg |
Negate double |
Objects and Arrays (Chapter 15)
Instructions that deal with objects
new |
Create a new object |
checkcast |
Make sure object is of a given type |
getfield |
Fetch field from object |
putfield |
Set field in object |
getstatic |
Fetch static field from class |
putstatic |
Set static field in class |
instanceof |
Determine if an object is of a given type |
Instructions that deal with arrays
newarray |
Allocate new array of primitive type components |
anewarray |
Allocate new array of reference type components |
arraylength |
Get length of an array |
multianewarray |
Allocate a new multi-dimensional array |
Control Flow (Chapter 16)
Conditional branch instructions
ifeq |
Branch if equal to 0 |
ifne |
Branch if not equal to 0 |
iflt |
Branch if less than 0 |
ifge |
Branch if greater than or equal to 0 |
ifgt |
Branch if greater than 0 |
ifle |
Branch if less than or equal to 0 |
if_icmpeq |
Branch if ints equal |
if_icmpne |
Branch if ints not equal |
if_icmplt |
Branch if int less than other int |
if_icmpge |
Branch if int greater than or equal to other int |
if_icmpgt |
Branch if int greater than other int |
if_icmple |
Branch if int less than or equal to other int |
ifnull |
Branch if null |
ifnonnull |
Branch if not null |
if_acmpeq |
Branch if object references are equal |
if_acmpne |
Branch if object references not equal |
Comparison instructions
lcmp |
Compare longs |
fcmpl |
Compare floats (-1 on NaN) |
fcmpg |
Compare floats (1 on NaN) |
dcmpl |
Compare doubles (-1 on NaN) |
dcmpg |
Compare doubles (1 on NaN) |
Unconditional branch instructions
goto |
Branch always |
goto_w |
Branch always (wide index) |
Table jumping instructions
tableswitch |
Access jump table by index and jump |
lookupswitch |
Access jump table by key match and jump |
Exceptions (Chapter 17)
athrow |
Throw exception or error |
Finally Clauses (Chapter 18)
jsr |
Jump to subroutine |
jsr_w |
Jump to subroutine (wide index) |
ret |
Return from subroutine |
Method Invocation and Return (Chapter 19)
Method invocation instructions
invokevirtual |
Invoke instance method, dispatch based on run-time type |
invokespecial |
Invoke instance method, dispatching based on compile-time type |
invokestatic |
Invoke a class (static) method |
invokeinterface |
Invoke interface method |
Method return instructions
ireturn |
Return int from method |
lreturn |
Return long from method |
freturn |
Return float from method |
dreturn |
Return double from method |
areturn |
Return reference from method |
return |
Return (void) from method |