观察代码的栈帧
package com.pl.jvm.stack;
import java.util.Arrays;
import java.util.List;
/**
* <p>
*
* @Description: TODO
* </p>
* @ClassName StackTest
* @Author pl
* @Date 2020/9/19
* @Version V1.0.0
*/
public class StackTest {
public static void main(String[] args) {
List<String> strings = Arrays.asList("111", "22222");
getNum(strings);
}
public static int getNum(List<String> list){
int size = list.size();
return size;
}
}
方法描述
main
image.pnggetNum
image.pngnotice:参数类型组成
Ljava/util/List
这是由两部分组成:
L代表引用类型
java/util/List 代表包名 java.util.list
Gneric info
Bytecode
image.png
Exception table
image.png
Misc
Code length 即Bytecode中字节码指令的长度 0-23
image.png
LineNumberTable
image.png对应java代码
notice:
n1.StartPC和LineNumber对照表
StartPC和LineNumber 对应着看,一起描述main方法,StartPC描述字节码指令的行号,Linenumber对应代码中的行号,Nr代表索引。
这里可以看出 方法体实际是从19号开始,到21行结束,
结合ByteCode看
image.png
n2.行号
代码中实际行号为LineNumber-1,而且return那行不在这个对照表中,}这个括号也不算。
image.png
args 0 对应 19,但是代码中是18,即LineNumber-1
局部变量表
image.pngnotice:
n1:startPC和length
startPC是字节码起始位置,length描述的是变量在字节码中的作用范围。
image.pngargs从0开始,作用范围为整个字节码长度。
strings从18开始,作用范围6。
startPC+Length=字节码的长度。
n2:如果返回值是其中的一个局部变量,那么返回值就不在局部变量表中,不多占用空间
image.png局部变量表中有两个,list和size
网友评论