美文网首页
结合演绎推理来与矛盾法来理解变量槽

结合演绎推理来与矛盾法来理解变量槽

作者: 乙腾 | 来源:发表于2020-09-25 00:14 被阅读0次

    变量槽相关知识的理解与佐证

    参数值的存放总是在局部变量数组的index0开始,到数组长度-1的索引结束

    image.png

    局部变量表,最基本的存储单元是Slot(变量槽)

    局部变量表中存放编译期可知的各种基本数据类型(8种),引用类型(reference),returnAddress类型的变量。

    在局部变量表里,32位以内的类型只占用一个slot(包括returnAddress类型),64位的类型(long和double)占用两个slot。
    byte、short、char、float在存储前被转换为int,boolean也被转换为int,0表示false,非0表示true;
    long和double则占据两个slot。

    JVM会为局部变量表中的每一个slot都分配一个访问索引,通过这个索引即可成功访问到局部变量表中指定的局部变量值

    434853468.png

    notice:

    n1.槽位其实是维护的数组
    n2.比如long,double都是占用两个槽,那么他们的索引是几呢?
    占用两个槽位,索引为起始索引。

    当一个实例方法被调用的时候,它的方法参数和方法体内部定义的局部变量将会按照顺序被复制到局部变量表中的每一个slot上

    槽位其实是维护的数组,数组是有序的,那么局部变量放到数组中也得是有序的,这个顺序按照按照声明顺序,先声明的放在前面。


    435351281.png

    可以发现槽位的索引确实是按照生命顺序排序的。

    如果需要访问局部变量表中一个64bit的局部变量值时,只需要使用前一个索引即可。(比如:访问long或者double类型变量)

    这个前面强调过了,占用两个槽位的变量,使用起始索引。

    如果当前帧是由构造方法或者实例方法创建的,那么该对象引用this将会存放在index为0的slot处,其余的参数按照参数表顺序排列

    通过三段演绎推理可以得出这么个结论:
    静态方法没有this。

    演绎推理过程:

    大前提:当帧是由构造方法或者实例方法(非static方法)创建的时候,该对象引用this将会存放在index为0的slot处,其余的参数按照参数表顺序排列。
    小前提:方法有两种,静态和实例方法(非静态)。
    结论:静态方法没有this

    量化佐证

    线性量化佐证

    实例方法的局部变量表


    image.png

    静态方法


    image.png
    矛盾量化佐证
    436312000.png

    静态方法中,用this编译报错。

    如果不接收其他方法返回值,不占用局部变量表的slot

    不接收方法返回值


    image.png

    接收方法返回值


    image.png

    栈帧中的局部变量表中的槽位是可以重复利用的,如果一个局部变量过了其作用域,那么在其作用域之后申明的新的局部变量就很有可能会复用过期局部变量的槽位,从而达到节省资源的目的。

    这句话可以分为这么两步去理解

    1.局部变量表的槽位是可以重复利用的

    其实这句话是可以推理出来的
    大前提:数组是可以修改的
    小前提:槽位通过数组维护
    结论:槽位是可以修改的,即可以重复利用的。

    2.如果一个局部变量过了其作用域,那么在其作用域之后申明的新的局部变量就很有可能会复用过期局部变量的槽位

    这句话,实际就是在讲什么时候才可以重复利用,即槽位可以重复利用的时机:
    重复利用,是分为两个动作的,老的数据从槽位出来,新的数据进入槽位。那么什么时候老数据从槽位中出来?那就是过了其作用域。

    通过以上分析,这句话就可以连起来理解了,栈帧中的局部变量表的槽位可以重复利用,一旦一个局部变量过了其作用域,其就会从现有槽位中释放,新的数据就可以利用其的槽位了,从而达到节省资源的目的。

    量化佐证

    437478671.png 437500390.png

    可以发现过了b的作用域后,c可以利用其槽位,索引也是2。

    相关文章

      网友评论

          本文标题:结合演绎推理来与矛盾法来理解变量槽

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