public class LocalVariableTest {
private int count = 0;
public static void main(String[] args) {
method();
}
public static void method() {
LocalVariableTest localVariableTest = new LocalVariableTest();
Date date = new Date();
int count = 10;
System.out.println(count);
}
}
我们来解析一下method()这个方法
javap -v LocalVariableTest.class
// main方法
public static void main(java.lang.String[]);
// 入参是 String类型的数组,返回值是Void
descriptor: ([Ljava/lang/String;)V
// 方法修饰 public 和static
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=0, locals=1, args_size=1
0: invokestatic #3 // Method method:()V
3: return
LineNumberTable:
line 14: 0
line 15: 3
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 args [Ljava/lang/String;
public static void method();
// 入参是空,返回值是void
descriptor: ()V
// 方法修饰是 public static
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=0
0: new #4 // class org/example/jvm/runtimedata/virtualmachinestack/LocalVariableTest
3: dup
4: invokespecial #5 // Method "<init>":()V
7: astore_0
8: new #6 // class java/util/Date
11: dup
12: invokespecial #7 // Method java/util/Date."<init>":()V
15: astore_1
16: bipush 10
18: istore_2
19: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
22: iload_2
23: invokevirtual #9 // Method java/io/PrintStream.println:(I)V
26: return
// jvm中对应关系,譬如 java文件中18行LocalVariableTest localVariableTest = new LocalVariableTest();
// 对应 jvm指令行 0 0: new #4 // class org/example/jvm/runtimedata/virtualmachinestack/LocalVariableTest
LineNumberTable:
line 18: 0
line 19: 8
line 20: 16
line 21: 19
line 22: 26
// 局部变量表:localVariableTest ,date,count signature是对应着几个的类型,他们是在一个数组里面的
// localVariableTest是数组index 0的位置,date是index 1的位置count是2的位置
// start是jvm中发对应的局部变量开始生效的位置,length是有效的长度(不详)
// jvm指令行中是0-26行,也就是一共27行,而start+length都是27
LocalVariableTable:
Start Length Slot Name Signature
8 19 0 localVariableTest Lorg/example/jvm/runtimedata/virtualmachinestack/LocalVariableTest;
16 11 1 date Ljava/util/Date;
19 8 2 count I
学习于:尚硅谷2020最新版宋红康JVM教程