运行时栈桢结构
局部变量表 – localVariableTable
局部变量表可以理解为一个数组,数组的每一个元素可以看做是一个slot
LocalVariableTable:
start length Slot Name Signature
0 11 0 args [Ljava/lang/String
5 6 1 buf [8
7 4 2 a I
[ 开头的代表引用类型
[B 代表一个字节,引用类型
成员变量,加载连接–准备时候会分配空间 然后初始化时候会赋予一个默认值 可以直接返回a+b;
局部变量,没有机会赋初始值的,所以add2() 方法不能return a+b;
slot复用:
局部变量表的被分配的slot是可以被复用的,当pc寄存器的值大于slot作用域的时候,在编译阶段就可以被复用,;
buff被{}包起来了,{}以外表示超过作用域;
上面那个{} 表示超过了作用域;
buff能否被回收依据buff,局部变量的soLT是否存有对象引用;
之后要进行垃圾回收,solt复用,buff被回收
操作数栈:
Microsoft Windows [版本 10.0.17763.194]
(c) 2018 Microsoft Corporation。保留所有权利。
E:\Hepburn‘s desk>javac Demo.java
E:\Hepburn‘s desk>java Demo
a_value0
E:\Hepburn‘s desk>javap -v Demo
Classfile /E:/Hepburn‘s desk/Demo.class
Last modified 2019-5-27; size 654 bytes
MD5 checksum bcfd8b0f4308251a717ca9cadf8ef656
Compiled from "Demo.java"
public class Demo
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #13.#22 // java/lang/Object."<init>":()V
#2 = Integer 31457280
#3 = Fieldref #23.#24 // java/lang/System.out:Ljava/io/PrintStream;
#4 = Class #25 // java/lang/StringBuilder
#5 = Methodref #4.#22 // java/lang/StringBuilder."<init>":()V
#6 = String #26 // a_value
#7 = Methodref #4.#27 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#8 = Methodref #4.#28 // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
#9 = Methodref #4.#29 // java/lang/StringBuilder.toString:()Ljava/lang/String;
#10 = Methodref #30.#31 // java/io/PrintStream.println:(Ljava/lang/String;)V
#11 = Methodref #23.#32 // java/lang/System.gc:()V
#12 = Class #33 // Demo