1.局部變量表(Local variables)
1.局部變量表也稱爲局部變量數組或本地變量表。
2.局部變量表定義爲一個數字數組,主要用於存儲方法參數和定義在方法體內的局部變量。(局部變量表的作用)
3.局部變量表示棧幀中的數據,棧幀被線程私有,所以不存在線程安全的問題,也就是多線程之間不會相互影響。
4.局部變量表的大小在編譯時期確定。一旦確定,就不會再改變。
查看局部變量表:將下面的java代碼產生的class文件使用javap進行反編譯。
public class LocalVariablesTest {
public static void main(String[] args) {
LocalVariablesTest test = new LocalVariablesTest();
int num = 10;
}
}
找到生成的LocalVariablesTest.class文件,使用javap -v LocalVariablesTest
, 輸出如下,最下面有一個LocalVariableTable
就是局部變量表。
可以看到局部變量表存儲了三個變量,分別爲args,test,num。並且都有大小solt。總共加起來的solt是3。這裏就可以看出來,局部變量表的大小是在編譯器確定的。因爲我們只是反編譯了class文件,就能夠看到局部變量表以及它的大小。
D:\Eclipse_workspace\JVM\jvn\bin\jvn>javap -v LocalVariablesTest
Classfile /D:/Eclipse_workspace/JVM/jvn/bin/jvn/LocalVariablesTest.class
Last modified 2020-7-1; size 466 bytes
MD5 checksum 24673853d3865f4d8d0bab8ca5b3435b
Compiled from "LocalVariablesTest.java"
public class jvn.LocalVariablesTest
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Class #2 // jvn/LocalVariablesTest
#2 = Utf8 jvn/LocalVariablesTest
#3 = Class #4 // java/lang/Object
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Utf8 Code
#8 = Methodref #3.#9 // java/lang/Object."<init>":()V
#9 = NameAndType #5:#6 // "<init>":()V
#10 = Utf8 LineNumberTable
#11 = Utf8 LocalVariableTable
#12 = Utf8 this
#13 = Utf8 Ljvn/LocalVariablesTest;
#14 = Utf8 main
#15 = Utf8 ([Ljava/lang/String;)V
#16 = Methodref #1.#9 // jvn/LocalVariablesTest."<init>":()V
#17 = Utf8 args
#18 = Utf8 [Ljava/lang/String;
#19 = Utf8 test
#20 = Utf8 num
#21 = Utf8 I
#22 = Utf8 SourceFile
#23 = Utf8 LocalVariablesTest.java
{
public jvn.LocalVariablesTest();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Ljvn/LocalVariablesTest;
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=1
0: new #1 // class jvn/LocalVariablesTest
3: dup
4: invokespecial #16 // Method "<init>":()V
7: astore_1
8: bipush 10
10: istore_2
11: return
LineNumberTable:
line 5: 0
line 6: 8
line 7: 11
LocalVariableTable: // 局部變量表,可以看到局部變量表存儲了三個變量,分別爲args,test,num。並且都有大小solt。總共加起來的solt是3。這裏就可以看出來,局部變量表的大小是在編譯器確定的。因爲我們只是反編譯了class文件,就能夠看到局部變量表以及它的大小。
Start Length Slot Name Signature
0 12 0 args [Ljava/lang/String;
8 4 1 test Ljvn/LocalVariablesTest;
11 1 2 num I
}
SourceFile: "LocalVariablesTest.java"
5.方法嵌套調用的次數有棧的大小決定。棧越大,方法嵌套調用的次數越多。一個方法,參數和局部變量越多,棧幀就越大,函數調用佔用的棧空間就越大,其能夠嵌套調用的次數就越少。
6.局部變量表中的變量只在當前方法中有效。當方法調用結束後,隨着方法棧幀的銷燬,局部變量表也會隨之銷燬。