考虑一下非常简单的人为设计代码:
public class TestJavap { public static void main(String[] args) { int a = 3; int b = 7; } }
javap产生这个:
public static void main(java.lang.String[]); Code: 0: iconst_3 1: istore_1 2: bipush 7 4: istore_2 5: return
为什么编译器非常类似领域生产不同字节码a
和b
.两者都是用常量文字初始化的整数类型.
因为a
它从池中取出常量iconst_3
,然后将其存储在变量中,istore_1
而对于b,它使用完全不同的机制(bipush
和的 组合istore
).
Rod_Algonqui.. 7
why the compiler is producing different byte code for very similar fields a and b
使用整数-1
- 5
iconst_x
(x是0到5的数字),它已经是一个常数字节码.
iconst_m1 02 ? -1 load the int value -1 onto the stack iconst_0 03 ? 0 load the int value 0 onto the stack iconst_1 04 ? 1 load the int value 1 onto the stack iconst_2 05 ? 2 load the int value 2 onto the stack iconst_3 06 ? 3 load the int value 3 onto the stack iconst_4 07 ? 4 load the int value 4 onto the stack iconst_5 08 ? 5 load the int value 5 onto the stack
因此,如果数字不是iconst_
字节码的常量值,那么它将使用bipush
字节码.
有关java字节码 && JVMS 列表的更多信息
why the compiler is producing different byte code for very similar fields a and b
使用整数-1
- 5
iconst_x
(x是0到5的数字),它已经是一个常数字节码.
iconst_m1 02 ? -1 load the int value -1 onto the stack iconst_0 03 ? 0 load the int value 0 onto the stack iconst_1 04 ? 1 load the int value 1 onto the stack iconst_2 05 ? 2 load the int value 2 onto the stack iconst_3 06 ? 3 load the int value 3 onto the stack iconst_4 07 ? 4 load the int value 4 onto the stack iconst_5 08 ? 5 load the int value 5 onto the stack
因此,如果数字不是iconst_
字节码的常量值,那么它将使用bipush
字节码.
有关java字节码 && JVMS 列表的更多信息