JVM学习笔记——虚拟机栈

局部变量表

定义为一个数字数组,主要用于存储方法参数和定义在方法体内部的局部变量(包括基本数据类型,对象引用以及returnAddress)

由于局部变量表建立在线程之上,是线程私有,所以不存在线程安全问题

局部变量表大小为编译器确定,运行期不改变大小

局部变量表的基本单位:slot

32位以内的数据类型占一个slot(包括returnAddress),64位的类型(double和long)占用两个slot

byte、short、char在存储前转化为int,boolean也被转化为int,0表示false 非0表示true

jvm会为局部变量表中每个slot分配一个访问索引,通过这个索引可以访问局部变量表中指定的值。
当一个方法被调用时,他的方法参数和方法体内部定义的局部变量将会按照顺序被复制到局部变量表中每个slot
如果需要访问局部变量表中一个64bit的局部变量时只需要使用前一个索引
如果当前帧由构造方法或实例方法创建的,那么该对象引用this将会存放在index位0的slot处其余参数按照参数表顺序继续排列
在这里插入图片描述

slot重复利用

在这里插入图片描述
观察变量b的索引为2,是因为在指向到c的时候已经出了b的作用范围(4,4),b的slot已经回收重新引用给变量c

补充

局部变量表中的变量也是重要的垃圾回收根节点,只要被局部变量表中直接或间接引用的对象都不会被回收

操作数栈

主要用于保存计算过程的中间结果,同时作为计算过程中变量临时存储的空间
操作数栈就是jvm执行引擎的一个工作区,当一个方法开始执行的时候,一个新的栈帧也随之创建,这个方法的操作数栈是空的

每个操作数栈都会有一个明确的栈深度用于存储数值,其所需的最大深度在编译器确定,保存在方法的code属性中,为max_stack值

栈中的任意一个元素都可以是任意的java数据类型
同局部变量表中的slot相同,32bit占一个栈深度,64bit占两个栈深度,但是!栈这种数据结构是没有索引的,所以操作数栈无法想slot一样根据索引访问

动态链接(指向运行时常量池的动态引用)

每一个栈帧内部都包含一个指向运行时常量池(方法模板存放的位置)中该栈帧所属方法的引用。包含这个引用的目的就是为了支持当前方法代码能够实现动态链接

在java源文件被编译到字节码文件时,所有变量和方法引用都作为符号引用保存在class文件的常量池里。比如:描述一个方法调用另一个方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就时为了将这些符号引用转化为调用方法的直接引用

方法的绑定机制(方法的调用)

静态连接(早期绑定)

当一个字节码文件被装在进JVM内部时,如果被调用的目标方法在编译期可知,且运行期保持不变。这种情况下将调用方法的符号引用转化为直接引用的过程称之为静态链接
举例:
在这里插入图片描述
父类只有一个

动态链接(晚期绑定)

如果被调用的方法在编译器无法确定下来,也就是说只能够在程序运行期将调用方法的符号引用转化为直接引用,由于这种引用转换过程具备动态性,因此也被称之为动态连接
举例:
在这里插入图片描述
(两个参数皆为父类或接口),因为在编译器无法判断使用的是那个父类对象

非虚方法

如果方法在编译期间就确定了具体调用成本,在运行时是不可变的,这样的方法称为非虚方法
静态方法、私有方法、final方法、构造器方法、父类方法
其他方法皆为虚方法

方法重写的本质

1、找到操作数栈顶的第一个元素所指向的对象的实际类型,记做c
2、如果在类型c中找到与常量中的描述符合简单名称都相符的方法,则进行权限校验,通过则返回这个方法的直接引用,查找结束。如果不通过返rllegalaccessError错误
3、否则,按照继承关系从下往上依次对c的各个父类进行第2步的探索与验证
4、如果始终没有找到合适方法,抛出abstractMethodError异常

面向过程的编程中会很频繁的使用动态分配,如果每次动态分配都要重新从类的方法元数据中搜索合适的目标的话会影响执行效率。为了提高性能,jvm采取在类的方法区简历一个方法表(非虚方法不回出现在表中)使用索引表来代替查找
在这里插入图片描述
上图为两个类的需方发表,其中由于son类和father分别重写了hardChoice和hardChoice方法,所以这两个方法指向了这两个类,而其他方法没有被重写,属于object方法,下次查找时直接到object中查找

方法返回地址

存放调用该方法的pc寄存器的值,无论是方法正常退出还是异常退出都返回到该方法被调用的位置。
正常退出时:调用者的pc寄存器的值作为返回地址,既调用该方法的指令的下一条指令的地址
非正常退出时:返回地址通过异常表来确定,栈帧中不会保存这部分信息。并且不回给他的上层调用者任何返回值
异常表:
在这里插入图片描述
注:字节码中第4行到16行如果出现问题跳转到19行

idea分析字节码指令

下载jclasslib Bytecode Viewer
在这里插入图片描述
在这里打开或者右侧
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值