本文分为3个部分,第一个部分列出常用的jvm指令,每一个指令基本都有几个类似的指令,看名字就知道了,比如像iconst、lconst、fconst、dconst这些主要是针对不同的类型(int、long、float、double),将对应类型的值push到栈顶,其他指令类似,所以基本指令就给出一个例子,其他的联想一个就好,第二部分,给出一小段代码,并给出指令集并详细给出每一行代码的解释。第三部给出jvm全部的指令集,方便查询
jvm基本指令
指令 | 含义 |
---|---|
iconst_1 | int型常量值1进栈 |
bipush | 将一个byte型常量值推送至栈顶 |
iload_1 | 第二个int型局部变量进栈,从0开始计数 |
istore_1 | 将栈顶int型数值存入第二个局部变量,从0开始计数 |
iadd | 栈顶两int型数值相加,并且结果进栈 |
return | 当前方法返回void |
getstatic | 获取指定类的静态域,并将其值压入栈顶 |
putstatic | 为指定的类的静态域赋值 |
invokevirtual | 调用实例方法 |
invokespecial | 调用超类构造方法、实例初始化方法、私有方法 |
invokestatic | 调用静态方法 |
invokeinterface | 调用接口方法 |
new | 创建一个对象,并且其引用进栈 |
newarray | 创建一个基本类型数组,并且其引用进栈 |
具体分析
一个简单的code如下,以此分析每一行代码的指令
publicstatic void main(String[] args) {
inta = 1;
intb = 9;
intc = a+b;
System.out.println(c);
System.out.println("HelloWorld");
}
public static void main(java.lang.String[]);
Code:
jvm基本指令
指令 | 含义 |
---|---|
0: iconst_1 | //将int型1推送到栈顶 |
1: istore_1 | //将栈顶元素存入第二个本地变量 |
2: bipush 9 | //将int型9推送到栈顶 |
4: istore_2 | //将栈顶元素存入第三个本地变量 |
5: iload_1 | //将第二个int型数值推送到栈顶 |
6: iload_2 | //将第三个int型数值推送到栈顶 |
7: iadd | //将栈顶两个int数值相加然后推入栈顶 |
8: istore_3 | //将栈顶int型数值存入第四个本地变量 |
9: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream; | //获取指定类的静态域,并将其压入栈顶 |
12: iload_3 | //将第四个int型数值推送到栈顶 |
13: invokevirtual #22 // Method java/io/PrintStream.println:(I)V | //调用实例方法 |
16: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream; | //获取指定类的静态域,并将其压入栈顶 |
19: ldc #28 // String Hello World | //将int、float、String类型常量从常量池中推送带栈顶 |
21: invokevirtual #30 // Method java/io/PrintStream.println:(Ljava/lang/String;)V | //调用实例方法 |
24: return | //从当前方法返回void |
全部Jvm指令
参见: