jvm 局部變量表 詳解

1.概念

局部變量表(Local Variable Table)
是一組變量值存儲空間,用於存放方法參數和方法內部定義的局部變量。在 Java 程序編譯爲 Class 文件時,就在方法的 Code 屬性的 max_locals 數據項中確定了該方法所需要分配的局部變量表的最大容量。

2.實操驗證

請看下面一段代碼

public class TestStack {
    private String test(long a, String b) {
        byte[] bytes = new byte[6 * 1024 * 1024];
        String str = a + b;
        System.gc();
        return str;
    }
}

javac -g TestStack.java先編譯,然後執行javap -c -l -p -v TestStack 輸出返彙編信息:
在這裏插入圖片描述

  • Code: 表明保存在方法的Code屬性中。
  • flags: ACC_PRIVATE: 代表私有方法。
  • stack=3, locals=6, args_size=3
    stack : 操作數棧的深度。
    locals : 佔用的槽的大小,long,double佔2個,其餘指針變量和int等佔1個。
    args_size: 方法參數,這裏多了一個this,所以是3。

下面是具體的局部變量表存儲的信息:在這裏插入圖片描述
Start : 表示從哪個字節碼偏移量作用域開始生效。
Length: 表示 到哪個字節碼偏移量 作用域結束。

比如:this變量,從0開始到32結束
在這裏插入圖片描述
表示整this在個方法作用域有效。
在比如: bytes變量: 從6開始到26結束
在這裏插入圖片描述
6的上一個指令是4,剛好就是把分配好的bytes[] bytes壓入操作數棧,從6開始生效。
26 時:執行gc把bytes銷燬了,作用域結束。

Slot : 槽信息
在這裏插入圖片描述
this : 佔了第0個槽 ,大小爲1 (引用變量佔1)。
a : 佔了第1到2個槽【下面是從3開始算了】,大小爲2(long變量佔2)。
以此類推…

Signature : 變量類型簽名

以上就是局部變量表 的 全部存儲信息。

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