美文网首页
通过jclassLib观察栈帧

通过jclassLib观察栈帧

作者: 乙腾 | 来源:发表于2020-09-23 08:05 被阅读0次

    观察代码的栈帧

    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.png

    getNum

    image.png

    notice:参数类型组成

    Ljava/util/List
    这是由两部分组成:
    L代表引用类型
    java/util/List 代表包名 java.util.list

    Gneric info

    Bytecode


    image.png

    Exception table


    image.png

    Misc

    image.png

    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.png

    notice:

    n1:startPC和length

    startPC是字节码起始位置,length描述的是变量在字节码中的作用范围。

    image.png

    args从0开始,作用范围为整个字节码长度。
    strings从18开始,作用范围6。
    startPC+Length=字节码的长度。

    n2:如果返回值是其中的一个局部变量,那么返回值就不在局部变量表中,不多占用空间

    image.png

    局部变量表中有两个,list和size

    相关文章

      网友评论

          本文标题:通过jclassLib观察栈帧

          本文链接:https://www.haomeiwen.com/subject/rqdnyktx.html