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 : 變量類型簽名
以上就是局部變量表 的 全部存儲信息。