标签:程序 之间 before 忽略 result together into for signed
操作数栈用于字节码指令执行期间,就像通用寄存器在CPU里使用一样。大部分JVM的字节码各自操作出栈,入栈,复制,交换,或者执行操作,使其生产和消费各种数据。因此,在字节码里,指令把值在局部变量表和操作数栈之间频繁移动。比如,一个简单的变量初始化导致两个字节码在操作数栈里交互影响。
int i;
编译后得到下面字节码:
0: iconst_0 // 将 0 入栈到操作数栈的顶端。
1: istore_1 // 从操作数栈顶端弹出并保存到局部变量
java里的常见整形长度表示范围:
byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1)
short的取值范围为-32768~32767,占用2个字节(-2的15次方到2的15次方-1)
int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1)
long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1)
当int取值-1~5:int取值0~5时JVM采用iconst_0、iconst_1、iconst_2、iconst_3、iconst_4、iconst_5指令将常量压入栈中,取值-1时采用iconst_m1指令将常量压入栈中
取值-128~127采用bipush指令(bipush 127),
取值-32768~32767采用sipush指令(sipush 32767)
取值-2147483648~2147483647采用 ldc 指令(ldc #2; //int 2147483647从常量池中获取值)。
java的栈
线程-线程的栈,栈帧-方法,线程执行方法时,就是栈帧出栈,入栈的过程。
栈帧:三部分:本地变量(参数+方法内的变量)、操作数栈和其他数据
Bytecode |
Stack before->after |
Description |
iconst_0 |
->0 |
Loads the int value 0 onto the stack |
istore_1 |
value-> |
Store int value into variable 1 |
istore_2 |
value-> |
Store int value into variable 2 |
iinc |
No change |
Increment local variable #index by signed byte const |
iload_1 |
->value |
Loads an int value from variable 1 |
iadd |
value 1,value 2->result |
Adds 2 ints together |
标签:程序 之间 before 忽略 result together into for signed
原文地址:https://www.cnblogs.com/erinchen/p/11610323.html