16.JVM棧幀內部結構-局部變量表

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.局部變量表中的變量只在當前方法中有效。當方法調用結束後,隨着方法棧幀的銷燬,局部變量表也會隨之銷燬。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章